数据库无法插入中文字符

INSERT INTO book VALUES (1, '楚辞', '屈原', '中国文联出版社', '0')

1366 - Incorrect string value: '\xE6\xA5\x9A\xE8\xBE\x9E' for column 'name' at row 1

查询时间: 0 秒

查看字符集设置

bash 复制代码
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

显示如下

配置项
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database latin1
character_set_filesystem binary
character_set_results utf8mb4
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

character_set_database 和 character_set_server 为 latin1:这两个参数分别代表数据库默认字符集与服务器默认字符集。latin1 字符集无法支持中文字符,要是用这个字符集来存储中文数据,就会出现乱码的情况。

插入中文字符数据时可能出现的问题

当你尝试插入中文字符数据时,由于服务器和数据库默认字符集是 latin1,中文字符无法正确存储,最终会以乱码形式呈现。

修改全局字符集设置

你可以修改 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或者 /etc/my.cnf),把服务器和数据库的默认字符集改成 utf8mb4。

我这边是通过deb包安装的,只有存在这个文件

bash 复制代码
/etc/mysql/my.cnf
bash 复制代码
sudo vim /etc/mysql/my.cnf

插入以下内容(往下看,先别直接插入)

bash 复制代码
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

发现/etc/mysql/my.cnf存在一行配置命令

bash 复制代码
!includedir /etc/mysql/conf.d/

通过搜索得知,该行命令引入了/etc/mysql/conf.d/目录下的配置文件,所以我们也就不直接在/etc/mysql/my.cnf下修改了,我们去该目录下(/etc/mysql/conf.d/)进行修改。

查看该目录下存在的文件

bash 复制代码
❯ cd /etc/mysql/conf.d
❯ ls
mysql.cnf  mysqldump.cnf

显然需要修改mysql.cnf

bash 复制代码
sudo vim mysql.cnf

然后把第一行空白的mysql,dd删掉,插入上方的配置文件。保存退出。

重启服务使配置生效

bash 复制代码
sudo systemctl restart mysql

然后删除原来创建数据库

就可以正常插入中文数据了。

bash 复制代码
CREATE DATABASE springbootdata
> OK
> 查询时间: 0 秒


USE springbootdata
> OK
> 查询时间: 0 秒


CREATE TABLE book (
id int(0) NOT NULL AUTO_INCREMENT,
name varchar(32) ,
author varchar(32),
press varchar(32),
status varchar(1) ,
PRIMARY KEY (id) USING BTREE
)
> OK
> 查询时间: 0.06 秒


INSERT INTO book VALUES (1, '楚辞', '屈原', '中国文联出版社', '0')
> Affected rows: 1
> 查询时间: 0.007 秒


INSERT INTO book VALUES (2, '纳兰词', '纳兰性德', '中国文联出版社', '1')
> Affected rows: 1
> 查询时间: 0.006 秒


INSERT INTO book VALUES (3, '西游记', '吴承恩', '中国文联出版社', '2')
> Affected rows: 1
> 查询时间: 0.012 秒

可以在重新创建的数据库中执行查询(原有数据库中的字符集是不会改变的,需要删除重新创建)

bash 复制代码
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
character_sets_dir	/usr/share/mysql/charsets/

发现已经更改为utf8了。

参考

https://blog.csdn.net/weixin_43770545/article/details/90482372

由此链接得知,可能是数据库默认的字符集的问题

相关推荐
jiayou6411 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE1 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3503 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3503 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3503 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB4 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶4 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构