MySQL 5.6 [HY000][1366] Incorrect string value
异常。
原因
普通的汉字使用 utf8
表示占位是三个字节,特殊情况下可能会用到 utf8
四字节的情况。 MySQL-5.5.3
之前的版本是不支持四字节 utf8
字符的,之后的版本可以通过 utf8mb4
使用四字节 utf8
编码。
解决方案
- 首先升级
MySQL
到 5.5.3
之后的版本。
- 关闭
MySQL
的服务,并且修改配置文件。(这个是为了以后重启数据库不会改变数据库配置)
1 2 3 4 5 6 7 8 9 10
|
[client] default-character-set = utf8mb4
[mysql] default-character-set = utf8mb4
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci init_connect = 'SET NAMES utf8mb4;'
|
- 修改对应的字符编码(可以掠过第二步直接设置,但是重启会被修改回来)
1 2 3 4 5 6
|
-- 任何一个只要不是 utf8mb4 就修改一下,正常应该是不用修改的。 set character_set_client = 'utf8mb4'; set character_set_connection = 'utf8mb4'; set character_set_databse = 'utf8mb4'; set character_set_server = 'utf8mb4'; set character_set_results = 'utf8mb4';
|
1 2 3
|
alter database test character set utf8mb4 collate utf8mb4_general_ci; alter table test.test convert to character set utf8mb4 collate utf8mb4_general_ci; alter table test.test modify columnName varchar(50) character set utf8mb4 collate utf8mb4_general_ci;
|
- 连接数据库的时候不要使用
characterEncoding=utf8
测试
1 2 3 4 5 6
|
-- 可以向数据库插入这个字符 检查是否成功 insert into tableName (name) values ('𦱾'); -- 检查字符编码 show variables like 'character%'; -- 检查版本号 select version();
|
总结经验
推广一下其实这样可以解决大部分字符编码的问题,不管是转换成 gbk
还是任何编码。像是由于其他问题导致的这个异常都可以通过修改成 utf8
的方式解决,但对于移动端的一些特殊字符,仅仅三个字节的 utf8
已经不能满足需求,所以才会使用 utf8mb4
这种编码。
其他问题
windows上mysql配置文件的位置
安装版本mysql启动都会有个配置参数,可以检查一下启动项的快捷方式:
1
|
"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" "-uroot" "-p"
|
免安装版本在安装到系统服务或者启动的时候,都会设置一个配置文件路径 mysqld install MySQL --defaults-file="D:\mysql-5.6.16-win32\my.ini"
如果是自动安装或者别人安装的话,可以直接在服务里增加启动参数:"--defaults-file=C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
,修改路径即可。
另附删除服务命令:mysqld remove