配置MySQL使之支持存储Emoji

前几天在写博客的过程中遇到了关于Emoji在MySQL中存储的问题,查阅了一些资料,特做整理。

什么Emoji

在阮一峰大神的博客中,对Emoji做了一些通俗易懂的介绍。大意如下

  • Unicode 标准化:现在的Emoji就是字符的一种,它会被渲染为图形
  • 不同的系统有不同的渲染实现

在MySQL中存储的问题

Emoji需要4个字节存储,而MySQL中的utf8只支持1-3个字节,在MySQL 5.5之后增加了utf8mb4字符集,可最多存储4个字节,所以要想能正常使用Emoji,得保证MySQL的版本不小于5.5,然后再对数据库做相应的配置。

查看MySQL版本

  1. 在终端下输入命令
mysql -V
  1. 或者在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/3


载入评论中....