UNICODE是被设计用于装载全地球语言文字,图标,表情符号的.

它不是静态的,它是动态的.意味着人类会永远更新它,永远不停的向里面添加新的文字,图标,表情符号

utf8,utf8mb3,utf8mb4

众所周知,英文字母一个字节(取值范围0-255)就可以搞定了.

汉字常用字七八千,全体汉字可能有十几万甚至几十万(因为还有倭制汉字朝鲜制汉字越南制汉字-你懂的,使用中国文明的国家都有闲的蛋疼自己造汉字的爱好).显然一个字节装不下汉字.

所以中国先后使用GB(国标),GBK(国标扩展),用两个字节装载汉字,那么一共可以容纳256*256=65535个汉字.一般情况下够用了,但是肯定容纳不了十几万中国用汉字.

后来人类发明了UNICODE,可以装载全球语言文字.

欧美人不干了,他们用英文字母本来只占1个字节,如果采用中国这样的编码方式,1个字母占2个甚至3个字节,对于他们来说是大大的浪费.

于是人类发明了UTF8编码.它是一种变长编码.即英文字母还是占1个字节,汉字基本占3个字节.

目前mysql用的utf8编码本质是utf8mb3,意思是1个字符最多占3个字节.这是一个坑!因为表情符号和后来更新的一些生僻汉字之类的不在此范围内!要使用这些必须使用utf8mb4,即1个字符最多占4个字节.

结论:你想用表情符号和特殊的生僻汉字等字符就必须使用utf8mb4编码.

ps:mysql未来可能将utf8解释为utf8mb4.但是现在仍旧是utfmb3.

校对规则的坑

utf8mb4该选择哪个校对规则呢?

utf8mb4_general_ci:ci即case insensitive,不区分大小写。速度最快.

utf8mb4_unicode_ci:是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,比 utf8mb4_general_ci精准 ,速度略慢,不区分 e和é这类字符,统一视作e.(这是1个坑!如果你为欧洲语言服务且对字符区分比较严格,肯定不能用这个校对规则!)

utf8mb4_bin区分大小写也区分e和é这类特殊字符的.速度最慢.

结论:如果你的字符串有特殊字母比如 e和é 需要区分(不想它们被认作e)就必须使用 utf8mb4_bin 校对规则.否则一般建议使用 utf8mb4_unicode_ci . utf8mb4_general_ci是遗留规则,不建议使用(虽然最快).如果对排序不敏感也可以使用utf8mb4_general_ci.

作者 申佳明

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注