前几天在写博客的过程中遇到了关于Emoji在MySQL中存储的问题,查阅了一些资料,特做整理。
什么Emoji
在阮一峰大神的博客中,对Emoji做了一些通俗易懂的介绍。大意如下
- Unicode 标准化:现在的Emoji就是字符的一种,它会被渲染为图形
- 不同的系统有不同的渲染实现
在MySQL中存储的问题
Emoji需要4个字节存储,而MySQL中的utf8只支持1-3个字节,在MySQL 5.5之后增加了utf8mb4字符集,可最多存储4个字节,所以要想能正常使用Emoji,得保证MySQL的版本不小于5.5,然后再对数据库做相应的配置。
查看MySQL版本
- 在终端下输入命令
mysql -V
- 或者在MySQL中输入命令
status
mysql> status;
如果MySQL版本不小于5.5,可以正式开始配置
一: 修改 my.cnf
(Linux系统中路径一般为 /etc/mysql/my.cnf
)
在my.cnf
文件末尾添加以下几行
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
然后保存my.cnf
文件
二: 修改相关数据库及数据表
将已有数据库转换为utf8mb4
mysql> ALTER DATABASE my_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
将已经建好的表也转换utf8mb4
mysql> ALTER TABLE my_tb_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改需要使用emoji的字段:
mysql> ALTER TABLE my_tb_name MODIFY COLUMN my_column_name varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
三:重启数据库
Ubuntu下一般为:
sudo systemctl restart mysql
四:登录数据库检查设置
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character%' 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 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+----------------------------+
11 rows in set (0.01 sec)
如果 character_set_client、character_set_connection、character_set_database、character_set_results、character_set_server
几个字段为utf8mb4,便说明配置成功了。
五:修改连接配置
如果是JDBC连接,去掉characterEncoding参数,并保证MySQL connector版本高于5.1.13,其它连接类似。
注
配置完MySQL之后,以后新建数据库和数据表都不需要再做额外的utf8mb4配置了(当然了,大量使用utf8mb4相对utf8来说肯定会有一些性能的影响)
在MySQL中可以查询数据表的详细信息,命令如下
mysql> use db_name;
mysql> show full columns from tb_name;
例如:
mysql> show full columns from post;
+--------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+--------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id | bigint(20) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| create_time | datetime | NULL | YES | | NULL | | select,insert,update,references | |
| last_modify | datetime | NULL | YES | | NULL | | select,insert,update,references | |
| content | text | utf8mb4_unicode_ci | YES | | NULL | | select,insert,update,references | |
| content_html | text | utf8mb4_unicode_ci | YES | | NULL | | select,insert,update,references | |
| img | varchar(255) | utf8mb4_unicode_ci | YES | | NULL | | select,insert,update,references | |
| summary | text | utf8mb4_unicode_ci | YES | | NULL | | select,insert,update,references | |
| title | varchar(255) | utf8mb4_unicode_ci | NO | | NULL | | select,insert,update,references | |
| category_id | bigint(20) | NULL | YES | MUL | NULL | | select,insert,update,references | |
| user_id | bigint(20) | NULL | YES | MUL | NULL | | select,insert,update,references | |
+--------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
10 rows in set (0.00 sec)
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明: 作者staneyffer,首发于我的博客,原文链接: https://chengfy.com/post/2
网友评论