MySQL 无法插入中文数据

本文最后更新于:2020年12月30日 下午

刚刚在 Linux Centos 装完 MySQL 后,想试一下是否能正常使用,但在插入中文数据时发生了下面的这个错误。

1
[HY000][1366] Incorrect string value: '\xE7\x90\x89\xE7\x92\x83' for column 'name' at row 1

感觉是 MySQL 编码问题,查看一下编码格式

1
show variables like '%char%';

结果

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem latin1
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
validate_password_special_char_count 1

果然有几个编码是不支持中文的,所以将 latin1 编码修改为 utf8mb4/utf8 就好啦

有关编码格式请参考:latin1, utf8, utf8mb4utf8 区别可以参考 https://my.oschina.net/xsh1208/blog/1052781

修改它们

1
2
3
4
5
6
set character_set_client = utf8mb4;
set character_set_connection = utf8mb4;
set character_set_database = utf8mb4;
set character_set_filesystem = utf8mb4;
set character_set_results = utf8mb4;
set character_set_server = utf8mb4;

然后再次尝试插入中文数据,好像还是不行呀,怎么办呢?实际上上面修改的是数据库默认的编码格式,对于已经存在的表和列并未生效

查看一下数据表编码

1
show create table user;
Table Crate Table
user CREATE TABLE user ( id bigint(20) NOT NULL COMMENT '编号', name varchar(20) NOT NULL COMMENT '名字', sex tinyint(1) DEFAULT NULL COMMENT '性别', age int(11) DEFAULT NULL COMMENT '年龄' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户'

查看全部列编码

1
show full columns from user;
Field Type Collation Null Key Default Extra Privileges Comment
id bigint(20) null NO “” “” select,insert,update,references 编号
name varchar(20) utf8_general_ci NO “” “” select,insert,update,references 名字
sex tinyint(1) null YES “” “” select,insert,update,references 性别
age int(11) null YES “” “” select,insert,update,references 年龄

现在有两个选择

  • 删除数据库重新建一个,数据库的编码格式就默认是 utf8mb4 了
  • 手动修改数据库,数据表,字段的编码方式
  1. 删除重建数据库的话只需要将数据库导出 sql 脚本,然后重新执行即可(如果存在很多数据/数据库正在使用则此方法不适用)
  2. 手动修改编码
    1. 修改数据库编码
      1
      alter database <db_name> character set utf8mb4;
    2. 修改数据表编码
      1
      alter table <table_name> character set utf8mb4;
    3. 修改字段编码
      1
      ALTER TABLE <table_name> MODIFY COLUMN <field_name> <field_type> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
      那么,关于 MySQL 不能插入中文数据的问题就到这里啦

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!