在MySQL中,字符集(Character Set)和排序规则(Collation)是两个密切相关的重要概念:
MySQL支持多种字符集,最常用的包括:
排序规则通常以字符集名开头,后跟排序规则特性:
_ci
:不区分大小写(Case Insensitive)_cs
:区分大小写(Case Sensitive)_bin
:二进制比较例如:
- utf8mb4_general_ci
:通用排序规则,不区分大小写
- utf8mb4_unicode_ci
:基于Unicode标准的排序规则
- utf8mb4_bin
:二进制比较
MySQL中可以在多个级别设置字符集和排序规则:
CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE TABLE mytable (
id INT,
name VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE mytable (
id INT,
name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
);
ALTER TABLE mytable
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
SHOW CHARACTER SET;
SHOW COLLATION;
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'mydb';
SELECT TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'mytable';
当不同字符集的数据交互时可能出现问题,常见场景:
解决方案:将字符集改为utf8mb4
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
解决方案:使用_bin排序规则或BINARY关键字
SELECT * FROM mytable WHERE name COLLATE utf8mb4_bin = 'John';
-- 或
SELECT * FROM mytable WHERE BINARY name = 'John';
通过理解MySQL的字符集和排序规则,您可以避免许多数据存储和查询中的常见问题,确保应用程序正确处理多语言数据。