Mac De Oracle Heterogeneous! #45 Tweet
数値型のつづき。
Generic Connectivity経由でMySQL4.0.25及び、MySQL4.1.13aの数値型にアクセス 最終回。
Generic Connectivity経由でdecimal型と同型の符号なしにアクセスした結果。
ここでは、以下のように定義した。
decimal(38,0)と同型の符号なし。
decimal(38,16)と同型の符号なし。
MySQL4.1.13a、MySQL4.0.25では、Oracleのnumber型の精度より低い。これらの型もGeneric Connectivity経由で参照、更新するのは避けたほうがよさそうである。
(実際にはインサート文も検証しているが結果は同じであるため省略)
1)MySQL4.0.25の decimal(38,0)とdecimal(38,0) unsignedを
Generic Connectivity経由で問い合わせた結果
CORYDORAS> set numwidth 40
CORYDORAS> select
2 "r_decimal_38",
3 "r_decimal_38_unsigned"
4 from
5 num_test_mysql4025_mac@oracle10g_win;
r_decimal_38 r_decimal_38_unsigned
---------------------------------------- ----------------------------------------
NULL NULL
0 0
0 0
NULL NULL
・
中略
・
NULL NULL
99999999999999997748809823456034029568 0
-99999999999999997748809823456034029568 99999999999999997748809823456034029568
NULL NULL
・
中略
・
NULL NULL
25行が選択されました。
2)MySQL4.1.13aの decimal(38,0)とdecimal(38,0) unsignedを
Generic Connectivity経由で問い合わせた結果
MySQL4.1.13aでは、不具合では?と思える部分(99999999999999999999999999999999999999が100000000000000035527741686413195739136となり精度が39桁になってしまっている)もある。
CORYDORAS> list
1 select
2 "r_decimal_38",
3 "r_decimal_38_unsigned"
4 from
5* num_test_mysql4113a_mac_sv@oracle10g_win
CORYDORAS> /
r_decimal_38 r_decimal_38_unsigned
---------------------------------------- ----------------------------------------
NULL NULL
0 0
0 0
NULL NULL
・
中略
・
NULL NULL
100000000000000035527741686413195739136 0
-99999999999999999999999999999999999999 99999999999999999999999999999999999999
NULL NULL
NULL NULL
27行が選択されました。
CORYDORAS>
3)MySQL4.0.25のdecimal(38,16)とdecimal(38,16) unsignedを
Generic Connectivity経由で問い合わせた結果
decimalの精度は、doubleと同じというMySQL側の仕様の影響だと思われるが、MySQL独特な動作の一つである数値の丸めが発生し、decimal(38,0)では最大値の精度が23桁になってしまっている。これもgeneric connectivity経由での参照、更新対象にはしないほうがよいだろう。
CORYDORAS> select
2 "r_decimal_38_16",
3 "r_decimal_38_16_unsigned"
4 from
5 num_test_mysql4025_mac@oracle10g_win;
r_decimal_38_16 r_decimal_38_16_unsigned
---------------------------------------- ----------------------------------------
NULL NULL
0 0
0 0
NULL NULL
・
中略
・
NULL NULL
-9999999999999999999999.9999999999999999 0
10000000000000000000000 9999999999999999999999.9999999999999999
NULL NULL
NULL NULL
25行が選択されました。
4)MySQL4.1.13aのdecimal(38,16)とdecimal(38,16) unsignedを
Generic Connectivity経由で問い合わせた結果。
3)とほぼ同じ結果であった。
CORYDORAS> list
1 select
2 "r_decimal_38_16",
3 "r_decimal_38_16_unsigned"
4 from
5* num_test_mysql4113a_mac_sv@oracle10g_win
CORYDORAS> /
r_decimal_38_16 r_decimal_38_16_unsigned
---------------------------------------- ----------------------------------------
NULL NULL
0 0
0 0
NULL NULL
・
中略
・
NULL NULL
-9999999999999999999999.9999999999999999 0
10000000000000004194304 9999999999999999999999.9999999999999999
27行が選択されました。
CORYDORAS>
==================================
Generic Connectivity経由での数値型の参照、更新のまとめ(MySQL4.0.x、4.1.x編)
| 数値型マッピング | |||
|---|---|---|---|
| MySQL4.0.25 MySQL4.1.13a |
Oracle10g R1 | Generic Connectivityでの利用 | 備 考 |
| tinyint型 | number型 | ○ | 注1) |
| tinyint unsigned型 | × | 直接利用するのは避けたほうがよいだろう。参照するだけならば、MySQLの表データをCSVファイル化し外部表で取り込む等、直接参照しないアプローチを考えたほうがよいだろう。注1) | |
| smallint型 | ○ | 注1) | |
| smallint unsigned型 | × | 直接利用するのは避けたほうがよいだろう。参照するだけならば、MySQLの表データをCSVファイル化し外部表で取り込む等、直接参照しないアプローチを考えたほうがよいだろう。注1) | |
| mediumint型 | ○ | 注1) | |
| mediumint unsigned型 | ○ | 注1) | |
| int型 | ○ | 注1) | |
| int unsigned型 | × | 直接利用するのは避けたほうがよいだろう。参照するだけならば、MySQLの表データをCSVファイル化し外部表で取り込む等、直接参照しないアプローチを考えたほうがよいだろう。注1) | |
| bigint型 | × | 直接利用するのは避けたほうがよいだろう。参照するだけならば、MySQLの表データをCSVファイル化し外部表で取り込む等、直接参照しないアプローチを考えたほうがよいだろう。注1) | |
| bigint unsigned型 | × | 同上 | |
| float型 | ○ | 注1) | |
| float unsigned型 | ○ | 注1) | |
| double型 | × | 直接利用するのは避けたほうがよいだろう。参照するだけならば、MySQLの表データをCSVファイル化し外部表で取り込む等、直接参照しないアプローチを考えたほうがよいだろう。注1) | |
| double unsigned型 | × | 同上 | |
| decimal(38,0) | △ | double型と同じ精度ということなので、結果を見る限りdecimal(16,0)ぐらいまでなら利用できそうであるが、利用するのは避けたほうが無難かもしれない。どうしても利用したい場合には、Generic Connectivity以外のアプローチを考えたほうがよいかもしれない。例えば、参照だけならば、MySQLのデータをCSVファイル化し外部表で取り込む等。注1) |
|
| decimal(38,0) unsigned | △ | 同上 | |
| decimal(38,16) | × | 直接利用するのは避けたほうがよいだろう。参照するだけならば、MySQLの表データをCSVファイル化し外部表で取り込む等、直接参照しないアプローチを考えたほうがよいだろう。注1) |
|
| decimal(38,16) unsigned | × | 同上 | |
注1)数値型を扱う際にinsertやupdate文では、値が有効範囲を超えると数値が最大値、最小値に丸められるというMySQLの仕様に要注意。但し、MySQL5.0.2以降であればSQL_MODEの設定でエラーとして扱うこともできるようなので、それがうまく機能すれば回避することは可能かもしれない。(現時点では未確認)
次回、文字型の検証へつづく。
| 固定リンク | 0


コメント