用了许久的mysql5.7,发现插入中文数据,报错“SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE5\xA4\xA7\xE9\xBB\x84' for column 'name' at row 1”。原来是mysql5.7默认的字符集是欧美
latin1字符集,不支持中文,需要把字符集更改为 UTF-8。原文链接如下:
步骤1:查看编码命令
show variables like 'character_%';
1
此命令是中包含 ‘character_’ 开头的变量或属性。
例子:
mysql> show variables like 'character_%'; +--------------------------+---------------------------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | E:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ | +--------------------------+---------------------------------------------------------+ 8 rows in set, 1 warning (0.02 sec) 1234567891011121314
可以看到第3行与第6行的 database 和 server 都是 latin1 字符集,因此都不支持中文。
show variables like 'collation_%';
1
此命令是查看数据库中包含 ‘collation_’ 开头的变量或属性。是用于字符串的比较规则。
例子:
mysql> show variables like 'collation_%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | gbk_chinese_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 3 rows in set, 1 warning (0.00 sec) 123456789
可以看到第2和第3行,database 和 server 的比较规则都是基于 latin1 字符集的比较规则。都是不支持中文的。
步骤2:修改MySQL的数据目录下的my.ini配置文件
根据你的电脑的路径找到 my.ini 配置文件,这里我的安装路径是 E:\ProgramData\MySQL\MySQL Server 5.7。用 EditPlus 打开。

[mysql] #大概在第63行左右,在其下添加
...
default-character-set=utf8 #默认字符集
[mysqld] #大概在第76行左右,在其下添加
...
character-set-server=utf8
collation-server=utf8_general_ci
12345678
保存后即可关闭该文件。
步骤3:重启服务
去计算机管理–>服务中重新启动 MySQL57: (重启服务,不等于重启mysql5.7软件)

步骤4:察看编码命令
重启好后,在Windows命令行中重新登录 MySQL57。
mysql -uroot -P13306 -p
Enter password: *********
12
再次输入这两个命令:
show variables like 'character_%';
show variables like 'collation_%';
12
输出:
mysql> show variables like 'character_%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | E:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)
1234567891011121314
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | gbk_chinese_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set, 1 warning (0.00 sec)
123456789
可以看到,两个输出结果中,database 和 server 的变量中默认字符集都变成了 UTF-8。至此,MySQL 5.7 不支持中文的问题就顺利解决了。
在非Utf8时建的表的补救之法
上述方法不能挽救已存在的表的字符集,不过往后新建表字符集是utf8.
show create table department;
用此命令确认之前建的表的字符集还是latin1

因此,还需要修改表格的编码方式。
修改表格的默认编码方式,并插入数据试一下
alter table tablename character set utf8;
但是插入中文数据还是不行。看下图,仔细一看,原来列的的字符集还是latin1,所以我们应该对字段进行编码方式修改

alter table tablename modify columnname varchar(20) character set utf8; 这儿约束需要根据自己原来的约束情况加,比如原来是not null ,你用上面的代码会变成允许null。 但是这样太累了,10个表100个字段,执行100次,如果可以,删库重建吧。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.ink0.cn/index.php/2023/01/15/mysql%e6%9b%b4%e6%94%b9%e4%b8%bautf8/
共有 0 条评论