utf8mb4_general_ci 和 utf8mb4_unicode_ci
所属分类 mysql
浏览量 13
utf8mb4_general_ci 和 utf8mb4_unicode_ci
是 utf8mb4 字符集下最常用的两种排序 / 比较规则,
核心差异体现在排序逻辑、语言适配、性能三方面。
utf8mb4_unicode_ci(或 520 版本)是最优选择,兼顾语言正确性和性能
仅在极简场景下考虑 utf8mb4_general_ci
`field1` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL,
`field2` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
select * from test_001 where field1 <> field2
报错
java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '!='
一、核心概念:utf8mb4 与排序规则(_ci 后缀)
utf8mb4:
MySQL 中真正支持完整 UTF-8 的字符集(可存储 4 字节的 emoji、特殊汉字等,而旧版 utf8 仅支持 3 字节)。
_ci:Case Insensitive(大小写不敏感),即查询时 A 和 a 视为相同;
_cs 是大小写敏感,_bin 是二进制比较(严格按编码值)
二、关键差异对比
维度/utf8mb4_general_ci / utf8mb4_unicode_ci
排序规则
基于简单字符编码值的通用排序(非语言专属),规则粗糙
基于 Unicode 标准的排序算法(Unicode Collation Algorithm, UCA),适配多语言
语言适配性
差:对重音、特殊字符处理不符合语言习惯(如德语 ß 不视为 ss,法语重音字符排序混乱)
优:支持语言特定排序(如西班牙语 ñ 排在 n 后,德语 ß 等效 ss)
大小写 / 重音处理
仅基础大小写不敏感,重音不忽略(如 é ≠ e)
可配置忽略重音(需结合 utf8mb4_unicode_520_ci 等新版本),更符合自然语言习惯
性能
快:排序规则简单,计算成本低
稍慢:规则复杂,需处理语言特殊逻辑(MySQL 5.5+ 优化后差距已极小)
兼容性
老版本 MySQL 默认,兼容性广
MySQL 4.1+ 支持,5.5+ 推荐使用
三、典型场景示例
1. 排序差异(以欧洲语言为例)
utf8mb4_general_ci:
排序时 ä 直接按编码值排在 z 后,不符合德语习惯;ñ 和 n 视为相同(编码值接近)。
utf8mb4_unicode_ci:
德语中 ä 等效 ae 参与排序,西班牙语 ñ 单独排在 n 和 o 之间,符合语言规范。
2. 查询匹配差异
-- 表结构:test (name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE 规则)
INSERT INTO test (name) VALUES ('café'), ('cafe'), ('Café');
-- 用 utf8mb4_general_ci 查询
SELECT * FROM test WHERE name = 'cafe';
-- 结果:仅匹配 'cafe'(重音 `é` ≠ `e`)
-- 用 utf8mb4_unicode_ci(或 utf8mb4_unicode_520_ci)
SELECT * FROM test WHERE name = 'cafe';
-- 结果:匹配 'café'、'cafe'、'Café'(忽略重音+大小写)
四、选型建议
优先选 utf8mb4_unicode_ci(或 utf8mb4_unicode_520_ci)的场景:
业务涉及多语言(如欧洲、拉美语言,或需要正确处理重音 / 特殊字符);
对排序 / 匹配的语言规范性要求高(如电商商品名称、用户昵称的排序);
现代 MySQL 版本(5.5+),性能损耗可忽略。
可选 utf8mb4_general_ci 的场景:
仅处理纯英文 / 基础中文,无特殊字符 / 重音需求;
极老版本 MySQL(4.1 以下),或对性能有极致要求(如超大规模数据排序)
五、补充:utf8mb4_unicode_520_ci
MySQL 5.6+ 新增的 utf8mb4_unicode_520_ci 是 utf8mb4_unicode_ci 的升级版,
基于 Unicode 5.2.0 标准,修复了更多语言排序问题(如中文拼音排序、日语假名排序),推荐优先使用。
六、修改表 / 字段的排序规则
-- 修改表的默认排序规则
ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改字段的排序规则
ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改 MySQL 字段的排序规则(Collation)不会改变字段存储的原始数据,
但会影响数据的比较、排序、查询匹配逻辑,以及极少数情况下的 “字符合法性校验”(几乎可忽略)
上一篇
下一篇
《道德经》精简版 500字
量化策略研究员知识点和技能
量化策略研究员所需的编程技能
《宽客:华尔街顶级数量金融大师的另类人生》精华笔记
量化策略分类
量化策略评估指标