mysql使用utf8mb4

最近做一次数据库的数据转移,在过程中返现,有一部分的数据在insert到新的DB中出现了这样的错误:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1  

这是字符集不支持的异常。
新旧数据库都使用的是utf8编码,emoji在旧的数据库中查询显示的是乱码,应该在insert的时候做了一些特殊的处理后保存的.utf8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。其中Emoji表情是4个字节,而MySql的utf8编码最多3个字节,所以导致了数据插不进去。
解决办法是将新的数据库的编码从utf8修改为utf8mb4.

第一步:版本检查

mysql从5.5.3开始支持utf8mb4

查看mysql版本(四种方法):
1. mysql -V
2. mysql --help | grep Distrib
3. mysql> status;
4. mysql> select version();
如果低于5.5.3请先停止mysql服务后,卸载老版本,然后安装最新版本的数据库

停止mysql /etc/init.d/mysql stop
卸载mysql yum remove mysql mysql-*
安装mysql 传送门

第二步:修改mysql配置文件

修改mysql的配置文件/etc/mysql/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'

第三步:重启数据库

/etc/init.d/mysql restart

第四步:检查配置

进入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)

特别说明下:
collation_connection/collation_database/collation_server如果是utf8mb4_general_ci没有关系

但必须保证:
character_set_client/character_se_connection/character_set_database/character_set_results/character_set_server为utf8mb4。

第五步,更新java驱动

MySQL Connector/J 在5.1.13之前是不支持utf8bm4的官方介绍, 下载最新版本

第六步,客户端配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true

jdbc.username=root

jdbc.password=password

注意下jdbc.url的内容,characterEncoding=utf8可以配自动识别为utf8bm4

第七步:修改database、table和column字符集

SQL语句:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ALTER TABLE table_name table_name CHANGE column_name VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

总结

现在服务端会为越来越多的移动产品做数据存储,所以支持utf8bm4是今后必不可少的编码格式,最后提前就做好准备.

你可能感兴趣的:(DB,MySQL)