Incorrect string value: '\xE4\xB8\x80\xE7\xBA\xA7...' for column 'name' at row 1

在使用hibernate+mysql测试的时候出现的问题。

其实是编码不一致原因,mysql需要设置数据库为utf8


最简单是使用工具:mysql-front等等。。。



show variables like 'character%';查看字符编码

--更改字符集  
SET character_set_client = utf8 ;  
SET character_set_connection = utf8 ;  
SET character_set_database = utf8 ;  
SET character_set_results = utf8 ;  
SET character_set_server = utf8 ;  



SET collation_connection = utf8 ;  
SET collation_database = utf8 ;  
SET collation_server = utf8 ;  
连接数据库时:
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
查询之前:
set names gbk;

存中文显示长度太长,但是字段长度够长,说明字符集没设置
C:\Program Files\MySQL\MySQL Server 5.0\my.ini\
default-character-set=utf8
default-character-set=utf8

<think>我们正在解决MySQL插入数据时出现的1366 Incorrect string value错误。这个错误通常是由于字符集不匹配导致的,即客户端发送的字符编码与数据库表字段的字符编码不一致,或者数据库无法存储某些特殊字符(如emoji表情)。 根据引用[1]和引用[3],常见的解决方法是确保数据库、表和字段的字符集设置为utf8mb4,因为utf8mb4是utf8的超集,支持更广泛的Unicode字符(包括emoji表情)。而MySQL的utf8字符集最多只支持3个字节的字符,而一些字符(如emoji)需要4个字节。 此外,引用[2]提到了在启用enforce_gtid_consistency=true时可能会限制某些操作,但这个问题与字符集无关,所以我们先关注字符集设置。 以下是详细的解决步骤: ### 步骤1:检查数据库、表和字段的字符集 首先,我们需要确认当前数据库、表和字段的字符集设置。 #### 检查数据库字符集: ```sql SHOW CREATE DATABASE your_database_name; ``` 或者 ```sql SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = 'your_database_name'; ``` #### 检查表的字符集: ```sql SHOW CREATE TABLE your_table_name; ``` 或者 ```sql SELECT CCSA.character_set_name FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = 'your_database_name' AND T.table_name = 'your_table_name'; ``` #### 检查字段的字符集: ```sql SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = 'your_database_name' AND table_name = 'your_table_name' AND column_name = 'your_column_name'; ``` ### 步骤2:修改数据库、表和字段的字符集为utf8mb4 如果发现字符集不是utf8mb4,我们需要进行修改。 #### 修改数据库的默认字符集: ```sql ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ``` #### 修改表的字符集(以及所有字符类型的字段): ```sql ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 注意:这条语句会将该表中所有字符类型的字段(CHAR, VARCHAR, TEXT等)转换为utf8mb4。 #### 如果只想修改特定字段: ```sql ALTER TABLE your_table_name CHANGE your_column_name your_column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ### 步骤3:检查连接字符集 在应用程序中,确保连接数据库时使用的字符集也是utf8mb4。例如,在连接字符串中设置: - JDBC连接字符串:`jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&useSSL=false` 注意:对于MySQL Connector/J 8.0以上,通常不需要设置`characterEncoding`,因为默认已经是UTF-8。但是,为了确保正确,可以显式设置连接参数: ``` jdbc:mysql://localhost:3306/your_database_name?characterEncoding=utf8&useUnicode=true&useSSL=false ``` 但实际上,为了支持完整的utf8mb4,应该使用`utf8mb4`作为连接字符集,但JDBC驱动并不直接支持在连接参数中指定`utf8mb4`,而是使用`utf8`。在MySQL中,JDBC驱动会将`utf8`映射到utf8mb4(如果服务器支持)。所以,我们通常设置`characterEncoding=utf8`即可。 另外,在建立连接后,可以执行: ```sql SET NAMES utf8mb4; ``` 这样确保客户端、连接和结果都使用utf8mb4。 ### 步骤4:检查客户端字符集 确保你的应用程序在发送数据到数据库之前,字符串的编码是UTF-8。例如,在Java中,确保字符串是Unicode,并且在读写数据库时没有进行错误的编码转换。 ### 步骤5:处理已有数据 如果表中已有数据,在修改字符集后,建议检查一下数据是否正常。如果之前因为字符集问题导致数据乱码,修改字符集后并不会自动修复已经乱码的数据,可能需要重新导入正确编码的数据。 ### 步骤6:检查MySQL配置文件 在MySQL配置文件(my.cnf或my.ini)中,可以设置默认字符集。修改后需要重启MySQL服务。 在[mysqld]部分添加: ``` [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci ``` 在[client]部分添加: ``` [client] default-character-set = utf8mb4 ``` ### 步骤7:验证字符集设置 重新连接数据库,执行以下命令查看字符集设置: ```sql SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; ``` 确保`character_set_client`, `character_set_connection`, `character_set_database`, `character_set_results`, `character_set_server`等变量都是`utf8mb4`。 ### 示例:修改整个数据库的字符集 假设数据库名为`mydb`,表名为`mytable`,包含一个`VARCHAR`字段`content`。 1. 修改数据库字符集: ```sql ALTER DATABASE mydb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ``` 2. 修改表及其所有字段的字符集: ```sql ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 3. 在连接数据库后,执行: ```sql SET NAMES utf8mb4; ``` 4. 在应用程序的连接字符串中,确保指定了字符集(如上述JDBC连接字符串)。 ### 注意事项 - 修改字符集可能会锁表(对于大表),在生产环境中需谨慎,最好在低峰期操作。 - 备份数据:在修改字符集之前,务必备份数据库。 - 如果表中有索引,转换字符集可能会改变索引的大小(因为utf8mb4一个字符最多占4个字节,而utf8是3个字节)。如果字段长度接近索引最大长度(如767字节),可能需要调整字段长度。 ### 相关问题 1. 如何将MySQL的整个实例设置为默认使用utf8mb4? 2. 修改字符集后,为什么仍然出现乱码? 3. 如何修复已经乱码的MySQL数据? 4. 在Java中,如何确保字符串编码正确? 5. MySQL中utf8和utf8mb4有什么区别? 通过以上步骤,应该能够解决1366 Incorrect string value错误。如果问题仍然存在,请检查数据中是否包含非常特殊的字符,或者是否在其他环节(如应用程序处理、文件读取等)存在编码问题[^1][^3]。</think>## 解决 MySQL 1366 Incorrect string value 错误的完整指南 这个错误通常是由于字符集不匹配导致的,以下是系统化的解决方案: ### 🔧 核心解决步骤 1. **修改数据库字符集为 utf8mb4** ```sql ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ``` 2. **修改表字符集** ```sql ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 3. **修改字段字符集** ```sql ALTER TABLE your_table_name MODIFY your_column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 4. **设置连接字符集(关键步骤)** 在应用程序连接数据库时添加参数: ``` jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8 ``` ### ⚙️ 配置 MySQL 服务器(永久生效) 编辑 MySQL 配置文件 `my.cnf`(Linux)或 `my.ini`(Windows): ```ini [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' ``` 修改后重启 MySQL 服务: ```bash sudo systemctl restart mysql # Linux net stop mysql && net start mysql # Windows ``` ### 🔍 验证字符集设置 ```sql -- 检查数据库设置 SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA; -- 检查表设置 SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database'; -- 检查字段设置 SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_database' AND TABLE_NAME = 'your_table'; ``` ### 💡 特殊字符处理技巧 1. **处理 Emoji 表情符号** ```sql -- 确保字段使用 utf8mb4 且长度足够 ALTER TABLE messages MODIFY content VARCHAR(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 2. **Python 连接设置** ```python import pymysql conn = pymysql.connect( host='localhost', user='user', password='pass', db='db_name', charset='utf8mb4', # 关键参数 cursorclass=pymysql.cursors.DictCursor ) ``` 3. **Java JDBC 连接示例** ```java String url = "jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8"; Connection conn = DriverManager.getConnection(url, "user", "password"); ``` ### 🔄 数据修复流程 如果已有乱码数据: 1. 备份当前数据库 2. 导出数据时指定字符集: ```bash mysqldump -u root -p --default-character-set=utf8mb4 db_name > backup.sql ``` 3. 修改字符集设置(按上述步骤) 4. 重新导入数据: ```bash mysql -u root -p --default-character-set=utf8mb4 db_name < backup.sql ``` ### 📌 关键注意事项 1. **utf8 与 utf8mb4 区别**: - `utf8`:最多支持 3 字节字符(基本多语言平面) - `utf8mb4`:支持 4 字节字符(emoji、特殊符号等) 2. **索引长度限制**: 使用 utf8mb4 后,索引最大长度降为 191 字符(原为 255): ```sql CREATE TABLE users ( username VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ); ``` 3. **连接池设置**: 在连接池配置中同样需要指定字符集参数 通过以上步骤,99% 的 1366 错误都能解决。如果问题依旧,请检查客户端文件编码是否与数据库一致[^1][^3]。 --- ### 相关问题 1. 如何检测MySQL中哪些表/字段不是utf8mb4编码? 2. 使用utf8mb4后对MySQL性能有什么影响? 3. 如何在MySQL中正确处理包含emoji的搜索查询? 4. 不同编程语言连接MySQL时如何设置字符集? 5. utf8mb4与latin1转换时如何避免数据损坏?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值