MySQL 中 utf8 和 utf8mb4 的使用以及字符集相关(原文优秀,必读)

MySQL 在 5.5.3 之后 (查看版本:select version()😉 增加了这个utf8mb4的编码,mb4 就是 most bytes 4 的意思,支持的字节数最大为 4,即专门用来兼容四字节的 unicode。

对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议, 使用 VARCHAR 替代 CHAR 以有效节省空间。

当你的数据库里要求能够存入这些表情或宽字符时,可以把字段定义为 utf8mb4,同时要注意连接字符集也要设置为utf8mb4,否则在 严格模式 下会出现 Incorrect string value: /xF0/xA1/x8B/xBE/xE5/xA2… for column 'name' 这样的错误,非严格模式下此后的数据会被截断。

  • utf8 升级 utf8mb4
    如果你的表定义和连接字符集都是 utf8,那么直接在你的表上执行
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4;

则能够该表上所有的列的 character 类型变成 utf8mb4,表定义的默认字符集也会修改。

不要随便执行ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4, 特别是当表原本不是 utf8 时,除非表是空的或者你确认表里只有拉丁字符 ,否则正常和乱的就混在一起了。

最重要的是 ,你连接时使用的 latin1 字符集写入了历史数据,表定义是 latin1 或 utf8,不要期望通过 ALTER ... CONVERT ... 能够让你达到用 utf8 读取历史中文数据的目的,没卵用,老老实实做逻辑 dump。

索引键超长问题。Error 1071: Specified key was too long; max key length is 767 bytes。当使用 utf8mb4 编码后,主键 id 的长度设置 255,太长,只能设置小于 191 的。

utf8mb4的常见排序规则,默认为utf8mb4_0900_ai_ci ,即是 UCA(Unicode Collation Algorithm version) 9.0.0 版本的 Unicode,ai 表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的;ci 表示 case insensitive,不区分大小写 。

  • Pad_attribute:MySQL 比较字符串时尾部空格是否忽略
  1. NO PAD 排序规则将字符串末尾的空格处理为任何其他字符。
  2. PAD SPACE排序,尾部空格在比较中无关紧要; 比较字符串而不考虑任何尾随空格。

InnoDB 引擎,则应在所有平台上将此变量设置为 1 以强制名称转换为小写字母。

  • SET NAMES utf8mb4;
    等同于
SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET character_set_connection = utf8mb4;
  • MySQL 中的字符集转换过程
  1. MySQL Server 收到请求时将请求数据从 character_set_client 转换为 character_set_connection;
  2. 进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,其确定方法如下:

使用每个数据字段的 CHARACTER SET 设定值;
若上述值不存在,则使用对应数据表的 DEFAULT CHARACTER SET 设定值 (MySQL 扩展,非 SQL 标准);
若上述值不存在,则使用对应数据库的 DEFAULT CHARACTER SET 设定值;
若上述值不存在,则使用 character_set_server 设定值。

  1. 将操作结果从内部操作字符集转换为 character_set_results。

posted on 2019-01-28 17:00  cag2050  阅读(727)  评论(0编辑  收藏  举报

导航