【MySQL】[HY000][1366] Incorrect string value - 解决

  1. 1. 原因
  2. 2. 解决方案
  3. 3. 测试
  4. 4. 总结经验
  5. 5. 其他问题
    1. 5.1. windows上mysql配置文件的位置

MySQL 5.6 [HY000][1366] Incorrect string value 异常。

原因

普通的汉字使用 utf8 表示占位是三个字节,特殊情况下可能会用到 utf8 四字节的情况。 MySQL-5.5.3 之前的版本是不支持四字节 utf8 字符的,之后的版本可以通过 utf8mb4 使用四字节 utf8 编码。

解决方案

  • 首先升级 MySQL5.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

欢迎访问博客地址:https://www.zhoyq.com