マルチバイト以外では同じ値を返すが、マルチバイトだと異なった値が返ってくる。

CHAR_LENGTH(str)

文字列 str の長さ(文字数)を返す。 マルチバイト文字は 1 文字とみなされる。
したがって、5 個のマルチバイト文字で構成される文字列の場合、LENGTH() では 10 が返るが、CHAR_LENGTH() では 5 が返る。

LENGTH(str)

文字列 str の長さ(バイト)を返す。1個のマルチバイト文字は複数バイトになる。
したがって、5 個の 2 バイト文字で構成される文字列の場合、LENGTH() では 10 が返るが、CHAR_LENGTH() では 5 が返る。


mysql> select LENGTH('HOW-LONG?');
+---------------------+
| LENGTH('HOW-LONG?') |
+---------------------+
| 9 |
+---------------------+
1 row in set (0.00 sec)

mysql> select CHAR_LENGTH('HOW-LONG?');
+--------------------------+
| CHAR_LENGTH('HOW-LONG?') |
+--------------------------+
| 9 |
+--------------------------+
1 row in set (0.00 sec)

mysql>

lenght


mysql> select LENGTH('長さはどのくらいだろうか');
+------------------------------------+
| LENGTH('長さはどのくらいだろうか') |
+------------------------------------+
| 24 |
+------------------------------------+
1 row in set (0.00 sec)

mysql> select CHAR_LENGTH('長さはどのくらいだろうか');
+-----------------------------------------+
| CHAR_LENGTH('長さはどのくらいだろうか') |
+-----------------------------------------+
| 16 |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql>

length_2

—————————————————————————————————————
追記:  BINARY比較
—————————————————————————————————————

mysql> SELECT MD5('english') = MD5('ENGLISH');
+---------------------------------+
| MD5('english') = MD5('ENGLISH') |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set (0.00 sec)

md5

mysql> SELECT IF('ABC' = 'abc','TRUE','FALSE');
+----------------------------------+
| IF('ABC' = 'abc','TRUE','FALSE') |
+----------------------------------+
| TRUE |
+----------------------------------+
1 row in set (0.01 sec)

mysql> SELECT IF('ABC' = BINARY 'abc','TRUE','FALSE');
+-----------------------------------------+
| IF('ABC' = BINARY 'abc','TRUE','FALSE') |
+-----------------------------------------+
| FALSE |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(BINARY 'ABC' = BINARY 'abc','TRUE','FALSE');
+------------------------------------------------+
| IF(BINARY 'ABC' = BINARY 'abc','TRUE','FALSE') |
+------------------------------------------------+
| FALSE |
+------------------------------------------------+
1 row in set (0.00 sec)

mysql>

binary_check


大文字/小文字を混ぜ合わせてCHARのテーブルとBINARYのテーブルに
データをINSERTしてCOUNTなどで結果を比較。

TABLE CREATE WITH CHAR


mysql> desc ENGLISH;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> select * from ENGLISH;
+---------+
| name |
+---------+
| English |
| english |
| ENGLISH |
| eNgLiSh |
+---------+
4 rows in set (0.00 sec)

mysql> select distinct name from ENGLISH;
+---------+
| name |
+---------+
| English |
+---------+
1 row in set (0.00 sec)

mysql> select name,count(*) from ENGLISH group by name;
+---------+----------+
| name | count(*) |
+---------+----------+
| English | 4 |
+---------+----------+
1 row in set (0.00 sec)

char_table

TABLE CREATE WITH BINARY


mysql> desc ENGLISH_BIN;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | binary(10) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> select * from ENGLISH_BIN;
+------------+
| name |
+------------+
| English |
| english |
| ENGLISH |
| eNgLiSh |
+------------+
4 rows in set (0.00 sec)

mysql> select distinct name from ENGLISH_BIN;
+------------+
| name |
+------------+
| English |
| english |
| ENGLISH |
| eNgLiSh |
+------------+
4 rows in set (0.00 sec)

mysql> select name,count(*) from ENGLISH_BIN group by name;
+------------+----------+
| name | count(*) |
+------------+----------+
| ENGLISH | 1 |
| English | 1 |
| eNgLiSh | 1 |
| english | 1 |
+------------+----------+
4 rows in set (0.00 sec)

binary_table


INARYオペレータは2進性の文字列に続く文字列を送信します。キャラクタ毎よりも、
バイト毎の比較を強制的に行う簡単な方法です。BINARYは後続のスペースにも重要な意味を持たせます。

BINARY strはCAST(str AS BINARY)の略でもあります。


mysql> SELECT 'Hello world!' = 'Hello world!';
+----------------------------------+
| 'Hello world!' = 'Hello world!' |
+----------------------------------+
| 1 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'Hello world!' = BINARY 'Hello world!';
+----------------------------------------+
| 'Hello world!' = BINARY 'Hello world!' |
+----------------------------------------+
| 1 |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'a' = 'a ';
+------------+
| 'a' = 'a ' |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT 'a' = BINARY 'a ';
+-------------------+
| 'a' = BINARY 'a ' |
+-------------------+
| 0 |
+-------------------+
1 row in set (0.00 sec)

mysql>

binary


mysql> SELECT @var := BINARY 'Lennart';
+--------------------------+
| @var := BINARY 'Lennart' |
+--------------------------+
| Lennart |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT @var;
+---------+
| @var |
+---------+
| Lennart |
+---------+
1 row in set (0.00 sec)

mysql> SELECT UPPER(@var);
+-------------+
| UPPER(@var) |
+-------------+
| Lennart |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT UPPER(CONVERT(@var USING utf8));
+---------------------------------+
| UPPER(CONVERT(@var USING utf8)) |
+---------------------------------+
| LENNART |
+---------------------------------+
1 row in set (0.00 sec)

mysql>

binary2

参考サイト
———————————————–
9.5.3. BINARY オペレータ


最長16,777,215 (224 – 1) バイトの BLOB カラムでバイナリデータ格納。
既定値は設定する事が出来ない。
MEDIUMBLOBを指定すると16MB位のデータまで格納する事が出来ます。
最近のデジカメの写真をデータベースに保存するには十分そうですね。


mysql> CREATE TABLE `PHOTO_STORAGE` (
-> `PHOTOID` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `PHOTO` mediumblob NOT NULL,
-> `PHOTO_NAME` tinyblob NOT NULL,
-> PRIMARY KEY (`PHOTOID`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> desc PHOTO_STORAGE;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| PHOTOID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| PHOTO | mediumblob | NO | | NULL | |
| PHOTO_NAME | tinyblob | NO | | NULL | |
+------------+------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql>

blob


2,000 bytesのデータをBLOBに格納する場合、実際には2002bytesほど利用される。
2byteはデータの長さを格納している。

————————————————————————-

MySQLにファイルを格納する


PhotoArch


MYSQLの大文字/小文字の扱いについての確認


例えば、MYSQLのパスワードを格納している”mysql.user”テーブルのpassword列は
大文字小文字を区別する為に以下のようにbinを指定している。

`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ”

case_s

——————————————————————————————
MYSQLで何も指定しないでテーブルを作成した場合。”CASE IN SENSITIVE”
——————————————————————————————
mysql> CREATE TABLE T_varchar (MOJI varchar(10) unique);
Query OK, 0 rows affected (0.17 sec)

mysql> insert into T_varchar values(‘varchar(10)’);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into T_varchar values(‘Varchar(10)’);
ERROR 1062 (23000): Duplicate entry ‘Varchar(10’ for key ‘MOJI’

mysql> select * from T_varchar;
+————+
| MOJI |
+————+
| varchar(10 |
+————+
1 row in set (0.00 sec)

——————————————————————————————
↓↓↓↓↓ MYSQLでbinaryを指定してテーブルを作成した場合  ”CASE SENSITIVE” ↓↓↓
——————————————————————————————

mysql> CREATE TABLE T_binary (MOJI binary unique);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into T_binary values(‘b’);
Query OK, 1 row affected, 1 warning (0.14 sec)

mysql> insert into T_binary values(‘b’);
ERROR 1062 (23000): Duplicate entry ‘b’ for key ‘MOJI’
mysql> select * from T_binary;
+——+
| MOJI |
+——+
| b |
+——+
1 row in set (0.01 sec)

mysql>

mysql> insert into T_binary values(‘B’);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from T_binary;
+——+
| MOJI |
+——+
| B |
| b |
+——+
2 rows in set (0.00 sec)

mysql>

——————————————————————————————

mysql> CREATE TABLE T_latin1_bin (MOJI char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ” unique);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into T_latin1_bin values(‘T_latin1_bin’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into T_latin1_bin values(‘T_latin1_bin’);
ERROR 1062 (23000): Duplicate entry ‘T_latin1_bin’ for key ‘MOJI’
mysql> select * from T_latin1_bin;
+————–+
| MOJI |
+————–+
| T_latin1_bin |
+————–+
1 row in set (0.00 sec)

mysql>

mysql> insert into T_latin1_bin values(‘t_latin1_bin’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into T_latin1_bin values(‘T_latin2_bin’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from T_latin1_bin;
+————–+
| MOJI |
+————–+
| T_latin1_bin |
| T_latin2_bin |
| t_latin1_bin |
+————–+
3 rows in set (0.00 sec)

mysql>

——————————————————————————————

mysql> CREATE TABLE T_utf8_bin (MOJI char(41) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ” unique);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into T_utf8_bin values(‘utf8 COLLATE utf8_bin’);
Query OK, 1 row affected (0.01 sec)

mysql> insert into T_utf8_bin values(‘utf8 COLLATE utf8_bin’);
ERROR 1062 (23000): Duplicate entry ‘utf8 COLLATE utf8_bin’ for key ‘MOJI’
mysql> select * from T_utf8_bin;
+———————–+
| MOJI |
+———————–+
| utf8 COLLATE utf8_bin |
+———————–+
1 row in set (0.00 sec)

mysql> insert into T_utf8_bin values(‘utf8 COLLATE utf8_biN’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into T_utf8_bin values(‘Utf8 COLLATE utf8_bin’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from T_utf8_bin;
+———————–+
| MOJI |
+———————–+
| Utf8 COLLATE utf8_bin |
| utf8 COLLATE utf8_biN |
| utf8 COLLATE utf8_bin |
+———————–+
3 rows in set (0.00 sec)

mysql>

binaryを指定してあるので、case-sensitiveなので大文字、小文字は別データとして扱われる。

utf8_bin_casesensitive