InfiniDBのデータ型の扱いは基本的にはMySQLと同様ですが、CHAR型、VARCHAR型の文字長の扱いは異なります。MySQLの場合は、CHAR(12)やVARCHAR(12)の「12」は文字数を表しますが、InfiniDBではこの数字はバイト数を表します。
例えば、InfiniDBがサポートしているキャラクタセットはUTF-8なので、日本語データの場合は1文字につき3バイト使用します。そのため、CHAR(12)やVARCHAR(12)の列に日本語データを挿入するときMySQLの場合は
1 2 3 4 5 6 7 8 9 10 11 12
ア シ ス ト 本 社 は 市 ヶ 谷 で す
ア シ ス ト 本 社 は 市 ヶ 谷 で す
といったように12文字入りますが、InfiniDBの場合は、
1 2 3 4
ア シ ス ト本 社 は 市 ヶ 谷 で す
ア シ ス ト
といったように4文字(12バイト)しか入りません。
12文字を入れたい場合には、
12文字 ✕ 3バイト = CHAR(36)
と指定する必要があります。
もしCHAR(12)の列に12文字のデータを挿入した場合は、先頭から12バイト(4文字)分が挿入され残りは切り捨てられます。
※切り捨てられた場合、Warningが表示されます。
1 2 3 4 5 6 7 8 9 10 |
mysql> INSERT INTO t1 VALUES('アシスト本社は市ヶ谷です'); Query OK, 1 row affected, 1 warning (0.21 sec) mysql> SHOW WARNINGS; +---------+------+--------------------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------------------+ | Warning | 9999 | CAL0001: IDB-2025: Data truncated for column 'col1' | +---------+------+--------------------------------------------------------+ 1 row in set (0.00 sec) |
その場合、データは以下のように12バイト分しか入りませんのでご注意ください。
1 2 3 4 5 6 7 |
mysql> SELECT * FROM t1; +--------------+ | col1 | +--------------+ | アシスト | +--------------+ 1 row in set (0.12 sec) |