utf8_bin: 对内容区分大小写,可存储二进制内容。
utf8_unicode_ci:内容为可存储unicode编码,ci即case insensitive的缩写,意思为不区分大小写。
utf8_general_cs:即存储的内容字符集普遍兼容模式,cs则是case sensitive的缩写,意为识别时区分大小写。
utf8_spanish_ci:适用于西班牙通用编码,ci不区分大小写。
utf8_turkish_ci:适用于土耳其通用编码。
大小写敏感测试
例如:我们创建一个数据表student,字段(嗯,注意是字段设置的排序规则,而不仅仅是表的排序规则)设置为utf8_bin。
CREATE TABLE `student`
(
`id` int(11) NOT NULL
AUTO_INCREMENT,
`name` char(255)
COLLATE utf8_bin DEFAULT
NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT
CHARSET=utf8
INSERT INTO `student` VALUES
('1', 'xiaoming');
INSERT INTO `student` VALUES
('2', 'lily');
INSERT INTO `student` VALUES
('3', 'Xiaoming');
INSERT INTO `student` VALUES
('4', 'Lebron James');
INSERT INTO `student` VALUES
('5', 'Kobe');
mysql> select * from
student;
+----+--------------+
| id | name
|
+----+--------------+
| 1 |
xiaoming
|
| 2 |
lily
|
| 3 |
Xiaoming
|
| 4 | Lebron
James |
| 5 |
Kobe
|
+----+--------------+
5 rows in set
此时name字段的字符排序为utf8_bin,此时大小写敏感。
mysql> select * from student
where name like '%kobe%';
Empty set
当查询kobe时,Kobe的内容便不会匹配上。
当我们修改name的字符排序为utf8_unicode_ci时,大小写不敏感。则能查询到数据。
mysql> ALTER TABLE
`student`
MODIFY COLUMN
`name` char(255) CHARACTER SET utf8 COLLATE
utf8_unicode_ci NULL DEFAULT NULL AFTER `id`;
mysql> select * from student
where name like '%xiaoming%';
+----+----------+
| id | name
|
+----+----------+
| 1 | xiaoming
|
| 3 | Xiaoming
|
+----+----------+
mysql> select * from student
where name like '%kobe%';
+----+------+
| id | name |
+----+------+
| 5 | Kobe
|
+----+------+
我们在选用字段字符排序时,根据项目存储的数据的使用场景,来选择字符集排序方式。utf8_bin建议存储一些文件二进制内容,或者文件流是使用(预计也很少有这么用的),utf8_unicode_ci个人建议广泛使用,例如存储人物姓名、电子邮箱地址时,对于数据的检索很有用,这也是为什么mysql默认就是兼容大小写不敏感查询的原因吧。utf8_general_cs如有特殊需要,建议存储类似十六进制、md5值时存储,其实如有特殊要求时在检查使用就可以。