mysql utf8mb4

Posted yanxiatingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql utf8mb4相关的知识,希望对你有一定的参考价值。

遇到的问题
有一个项目需要存储 emoji 表情。另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错。

Rails creating schema_migrations - mysql2::Error: Specified key was too long

问题原因
mysql 里的 utf8 一个字符最多 3 字节,只支持 BMP 这部分的 unicode 编码区
BMP 是从哪到哪,基本就是0000~FFFF这一区
utf8mb4 则扩展到一个字符最多能有 4 字节,所以能支持更多的字符集
结论
utf8mb4 兼容 utf8 且比 utf8 能表示更多的字符
至于什么时候用,看unicode编码区
从 1 - 126 就属于传统 utf8 区,当然 utf8mb4 也兼容这个区,126 行以下就是 utf8mb4 扩充区,什么时候你需要存储那些字符,你才用 utf8mb4 否则只是浪费空间
涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集
utf8mb4 是 utf8 的超集
升级步骤
备份数据库
升级 MySQL Server 到 v5.5.3+ (低版本不支持这个字符集、复制报错)  select  version(); 查看数据库版本
修改 database、table 和 column 字符集
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Example
ALTER TABLE `table_name` MODIFY COLUMN `column_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
 
修改 my.cnf
[client]
default-character-set = utf8mb4
 
[mysql]
default-character-set = utf8mb4
 
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=SET NAMES utf8mb4
重启 MySQL Server、检查字符集
mysql> SHOW VARIABLES WHERE Variable_name LIKE character\_set\_% OR Variable_name LIKE collation%;
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
 rows in set (0.00 sec)
Rails 的 database.yml 里面的字符集配置也要改 encoding: utf8mb4
如何把 emoji 编码转换为 emoji 表情
Encode and decode emoji unicode characters into emoji-cheat-sheet form
阿里云 RDS 对 utf8mb4 的支持
RDS 是支持 utf8mb4 编码的。如果在数据库管理界面修改之后,对新创建的表默认就是支持 utf8mb4 ,对已经存在表,在字段上做字符集的修改操作才可以。

参考文章
MySQL utf8mb4 字符集:支持 emoji 表情符号
MySQL设置utf8mb4编码
Mysql处理emoji表情
Rails 3.2でios5の絵文字を扱う
The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)
Rails 3.2.12 not ready for mysql 5.5 utf8mb4
MySQL UTF8MB4 breaks ActiveRecord schema setup

 

以上是关于mysql utf8mb4的主要内容,如果未能解决你的问题,请参考以下文章

为啥MYSQL要设定用UTF8MB4编码UTF8MB4

为啥MYSQL要设定用UTF8MB4编码UTF8MB4

为啥MYSQL要设定用UTF8MB4编码UTF8MB4

mysql选择字符集utf8mb4

全面了解mysql中utf8和utf8mb4的区别

全面了解mysql中utf8和utf8mb4的区别