将CSV导入MySQL时触发1366字符错误,寻求解决方案
我来帮你分析下这个问题,你遇到的OperationalError: (1366, "Incorrect string value: '\\xE9 des ...' for column 'title' at row 29")错误,本质是字符集不匹配导致的,结合你的配置和代码,具体原因和解决步骤如下:
问题根源
你的表Movies指定了charset=utf8mb4(支持完整UTF-8,包括4字节字符),但MySQL连接的字符集(character_set_client、character_set_connection、character_set_results)都是utf8——注意这里MySQL的utf8其实是utf8mb3,最多只支持3字节的UTF-8字符,当CSV里的中文(比如第29行的中文标题)通过utf8连接字符集传递时,MySQL无法正确解析,就会抛出1366错误。另外,Python打开CSV文件时如果没指定编码,也可能导致字符读取异常。
解决步骤
1. 修改数据库连接的字符集为utf8mb4
在你连接MySQL的代码里,明确指定字符集为utf8mb4。比如使用pymysql库的话,连接参数要加上:
db = pymysql.connect( host='your_host', user='your_user', password='your_pwd', database='your_db', charset='utf8mb4' # 关键:指定utf8mb4字符集 )
这会覆盖全局的character_set_client等配置,确保连接使用和表一致的字符集。
2. 打开CSV文件时指定UTF-8编码
Python的open()函数默认使用系统默认编码(比如Windows下是GBK),如果你的CSV是UTF-8编码,必须显式指定编码:
def import_data(tablename, filename): # 显式指定encoding='utf-8'读取文件 with open(filename, encoding='utf-8') as f: reader = csv.reader(f) keys = next(reader) keys[0] = 'id' # 将csv里的`movieId`改为`id` database.insertmany(tablename, keys, reader)
3. 验证表的字符集配置
确认你的表确实使用了utf8mb4,可以执行以下SQL查看:
SHOW CREATE TABLE Movies;
输出结果里应该包含ENGINE=InnoDB DEFAULT CHARSET=utf8mb4。
4. 临时修改会话字符集(可选)
如果无法修改连接代码,可以在导入前执行以下SQL临时修改当前会话的字符集:
SET NAMES utf8mb4;
这会临时将character_set_client、character_set_connection、character_set_results设为utf8mb4,直到会话结束。
测试验证
修改后重新运行import_data('Movies', 'movies.csv'),第29行的中文标题应该能正常插入了。如果还有问题,可以检查CSV文件的编码是否为UTF-8(用文本编辑器比如Notepad++查看编码)。
内容的提问来源于stack exchange,提问作者Kungreye




