MySQL中存在多種格式的utf8編碼,其中最常見的兩種為:
- utf8_bin
- utf8_general_ci
utf8_bin將字符串中的每一個字符用二進制數據存儲,區分大小寫;
utf8_genera_ci不區分大小寫,ci為case insensitive的縮寫,即大小寫不敏感,為utf8默認編碼。
示例:
1 CREATE TABLE `t_bin` ( 2 `id` int(11) DEFAULT NULL, 3 `name` varchar(20) DEFAULT NULL, 4 UNIQUE KEY `uk_name` (`name`) 5 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 6 7 CREATE TABLE `t_ci` ( 8 `id` int(11) DEFAULT NULL, 9 `name` varchar(20) DEFAULT NULL, 10 UNIQUE KEY `uk_name` (`name`) 11 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 12 13 CREATE TABLE `t_default` ( 14 `id` int(11) DEFAULT NULL, 15 `name` varchar(20) DEFAULT NULL, 16 UNIQUE KEY `uk_name` (`name`) 17 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
執行以下語句:
1 insert into t_bin values (1, 'Alex'); 2 insert into t_bin values (2, 'alex'); 3 4 insert into t_ci values (1, 'Alex'); 5 insert into t_ci values (2, 'alex'); 6 7 insert into t_default values (1, 'Alex'); 8 insert into t_default values (2, 'alex');
結果如下:
1 root@zow 11:13:44>insert into t_bin values (1, 'Alex'); 2 Query OK, 1 row affected (0.01 sec) 3 4 root@zow 11:14:14>insert into t_bin values (2, 'alex'); 5 Query OK, 1 row affected (0.01 sec) 6 7 root@zow 11:14:17>insert into t_ci values (1, 'Alex'); 8 Query OK, 1 row affected (0.00 sec) 9 10 root@zow 11:14:32>insert into t_ci values (2, 'alex'); 11 ERROR 1062 (23000): Duplicate entry 'alex' for key 'uk_name' 12 root@zow 11:14:36>insert into t_default values (1, 'Alex'); 13 Query OK, 1 row affected (0.01 sec) 14 15 root@zow 11:14:50>insert into t_default values (2, 'alex'); 16 ERROR 1062 (23000): Duplicate entry 'alex' for key 'uk_name'
分析:
編碼為utf8_bin時,Alex和alex被認為是兩個不同的值,區分大小寫;
編碼為utf8_general_ci時,即默認的編碼時,Alex和alex被認為是相同的值,不區分大小寫。
所以在選擇編碼的時候應該注意區分。
