You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将CSV导入MySQL时触发1366字符错误,寻求解决方案

解决MySQL导入CSV时的OperationalError: 1366字符串值错误问题

我来帮你分析下这个问题,你遇到的OperationalError: (1366, "Incorrect string value: '\\xE9 des ...' for column 'title' at row 29")错误,本质是字符集不匹配导致的,结合你的配置和代码,具体原因和解决步骤如下:

问题根源

你的表Movies指定了charset=utf8mb4(支持完整UTF-8,包括4字节字符),但MySQL连接的字符集(character_set_clientcharacter_set_connectioncharacter_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_clientcharacter_set_connectioncharacter_set_results设为utf8mb4,直到会话结束。

测试验证

修改后重新运行import_data('Movies', 'movies.csv'),第29行的中文标题应该能正常插入了。如果还有问题,可以检查CSV文件的编码是否为UTF-8(用文本编辑器比如Notepad++查看编码)。

内容的提问来源于stack exchange,提问作者Kungreye

火山引擎 最新活动