おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

NUMERIC型の最大桁数の仕様が変更されている件

最近、「現場で使えるMySQL」を読んでMySQLを勉強し直してます。その本の中で、小数を扱うデータ型のNUMERIC型の定義について下記のように書いてありました。

NUMERIC型はOracleのNUMBER型と同様、NUMERIC(p,n)という形で定義され、pは全体の有効桁数、nは小数点以下の有効桁数を意味する。(...中略...) また整数部分は、負の値についてはOracleと同様p-n桁まで扱えるが、正の値については負の符号1バイト分も数値領域として割り当てることができるため、実質p-n+1桁まで扱える。例えば、NUMERIC(3,1)では、負の整数部分3-1=2桁、正の整数部分3-1+1=3桁、小数1桁、すなわち-99.9〜999.9となる。

なんかわかりにくいなあと思いませんか?僕は思いました。で、本当にそうなのか試してみました。ちなみにMySQLのバージョンは5.0.77を使っています。

mysql> create table numeric_test(col1 NUMERIC(3,1));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into numeric_test(col1) values(999.9);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from numeric_test;
+------+
| col1 |
+------+
| 99.9 | 
+------+
1 row in set (0.00 sec)

あれ?本の説明と違いますね。999.9が入っているはずが、99.9になっています。どうやら僕と同じように変な仕様だなーと思った人がいたのか、5.0.XXのどこかで仕様が変更になったみたいです。「現場で使えるMySQL」は、4.0,4.1,5.0それぞれのバージョンによる機能の違いを説明してくれていて大変参考になるのですが、5.0内でも仕様が変わっている部分があるので、実際に試しながら勉強しないとハマるかもしれませんねー。

現場で使える MySQL (DB Magazine SELECTION)
松信 嘉範
翔泳社
売り上げランキング: 44888
おすすめ度の平均: 5.0
5 よいです。
5 ODBC接続など実用的な内容
5 実践的な良書、作者の今後にも期待
4 システム管理者向け