人生最痛苦的事就是当你测试没BUG的时候 领导测试出bug了,然后你就得老老实实加班把这个BUG消灭掉,一直加班到凌晨两点也是醉了!这个问题一般会出现在所插入的列中出现了你当前数据库表字段设置的字符集不匹配的问题,这个时候你需要做的就是把mysql字符集往更高兼容的字符集上设置。我碰到的问题是昵称中带了emoji表情,虽然mysql的编码是UTF-8,但明显面对这种四个字节的emoji转义字符存储时还是报错了,解决办法就是把你的字符集全部修改成UTF8mb4(这个字符集是从mysql5.5.3开始支持的,所以如果你的mysql版本低于这个的话要么老老实实升级,要么你就自己在程序里过滤掉这种字符),不管是数据库还是数据表还有数据列都得修改为这个编码(如果是老数据库你就一个个改吧,如果是新建数据库删了重建也是不错的主意,新建数据库的时候记得选择COLLATE即排序规则为utf8mb4_bin或者utf8mb4_unicode_ci),你可以用以下命令去修改:
# 对每个数据库:
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 CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (不要盲目的复制以上代码,修改数据列的时候你得看数据列的实际类型以及其允许的实际最大长度,上面只是针对数据列是varchar类型的一个例子)
,改完了上面这些还得修改数据库的配置文件,在配置文件中相应位置添加以下配置
[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后,然后在控制台输入
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 | +--------------------------+--------------------+如果不是那你就用set命令去设置吧,比如我要修改character_set_client的编码,则输入以下命令:
set character_set_client=utf8mb4;
如果你觉得已经万事大吉了,那你就错了,在用mysql driver访问数据库的时候你可能还会出现这个错误,为什么说是可能,因为你可能刚好因为在jdbc url里少加了characterEncoding=UTF-8而逃过一劫,当然这和你用的driver版本也有关系,如果驱动版本大于等于5.1.22就不要加这个,如果不是就加上,当然useUnicode=true最好加在jdbc url里的。