第41回では,
検証環境
今回使用した環境は,
mysql> CREATE DATABASE characters; Query OK, 1 row affected (0.00 sec) mysql> use characters Database changed
MySQLの文字列型
MySQLには大きく分けて,
- CHAR
- VARCHAR
- BINARY
- VARBINARY
- BLOB
- TEXT
- ENUM
- SET
続いて各型の紹介をしていきます。CHAR型,
BINARY型とVARBINARY型
BINARY型とVARBINARY型の関係はCHAR型とVARCHAR型の関係と非常によく似ています。BINARY型はデータを固定長で扱い,
同様に確認してみましょう。まずは固定長のBINARYから確認します。以下のように長さが4のBINARY型のテーブルを用意します。続けて確認用に末尾にスペースがないa b
と末尾にスペースがあるa b
をINSERTします。
mysql> CREATE TABLE bin(bin BINARY(4)); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO bin(bin) VALUES ('a b '); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO bin(bin) VALUES ('a b'); Query OK, 1 row affected (0.00 sec)
どのように格納されているか,
mysql> select CONCAT('(',bin,')') from bin; +---------------------+ | CONCAT('(',bin,')') | +---------------------+ | (a b ) | | (a b ) | +---------------------+ 2 rows in set (0.00 sec)
CHAR型の時とは逆に,
続けてVARBINARY型を見てみましょう。同様に型を作成し,
mysql> CREATE TABLE varbin(bin VARBINARY(4)); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO varbin(bin) VALUES ('a b'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO varbin(bin) VALUES ('a b '); Query OK, 1 row affected (0.00 sec)
それではどのように格納されているか確認してみましょう。
mysql> select CONCAT('(',bin,')') from varbin; +---------------------+ | CONCAT('(',bin,')') | +---------------------+ | (a b) | | (a b ) | +---------------------+ 2 rows in set (0.00 sec)
こちらはVARCHAR型の時と同様に長さに合わせた値として保存されていることがわかります。
それ以外のCHAR型とVARCHAR型との違いとしては,ORDER BY
構文などを用いて並べ替えを行う際には,
BLOB型とTEXT型
BLOB
BLOB型はTINYBLOB, BLOB, MEDIUMBLOB, LONGBLOBの4種類が存在します。またTEXT型でも同様にTINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT型の4種類が存在します。これらの違いは保存できるデータの最大長です。各型での最大長は以下の表の通りになります。
型名 | 最大長 |
---|---|
TINYBLOB, TINYTEXT | 255バイト |
BLOB, TEXT | 65,535バイト |
MEDIUMBLOB, MEDIUMTEXT | 16,777,255バイト |
LONGBLOB, LONGTEXT | 4,294,967,295バイト |
BLOB型とTEXT型は,
mysql> CREATE TABLE text(text TEXT); Query OK, 0 rows affected (0.01 sec)
続けて,
mysql> ALTER TABLE text ADD INDEX index_text(text); ERROR 1170 (42000): BLOB/TEXT column 'text' used in key specification without a key length
BLOB/
mysql> ALTER TABLE text ADD INDEX index_text(text(10)); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
無事作成できました。このように,
一般的にこれらの型を使用する際には,max_
やinnodb_
を十分に大きくしないとエラーが発生してしまうこともあるので注意してください。
BLOB型に画像や動画などの大きなファイルを入れたい場合は,