最近做一次数据库的数据转移,在过程中返现,有一部分的数据在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的配置文件/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。
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
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是今后必不可少的编码格式,最后提前就做好准备.