问题:qlalchemy.exc.DataError: (pymysql.err.DataError) (1366, “Incorrect string value: ‘\xE9\x9D\x9E\xE5\x85\xB3…’ for column ‘Columns’ at row 3”)

原因:Columns列中存在中文,还有就是to_sql默认创建的数据表的编码格式是:ENGINE=InnoDB DEFAULT CHARSET=latin1 |

解决办法:在你要存储的数据库中运行:ALTER DATABASE db CHARACTER SET utf8 COLLATE utf8_general_ci;
就应该可以解决了;
如果不行,可以运行下方命令重试:
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_database = utf8mb4;

我的场景是,在内服服务器中存储数据库到外部服务器的mysql中,利用的是pandas中df.to_sql命令;详细如下:

import cx_Oracle
import pymysql
from sqlalchemy import create_engine
pymysql.install_as_MySQLdb()

df = pd.read_excel(.....)
# user 是数据库的用户名,password 是数据库密码,ip是服务器的ip地址,db是数据库名称
engine = create_engine('mysql+mysqldb://user:password@ip:3306/db?charset=utf8')
df.to_sql('db',con=engine,chunksize=10000,if_exists='replace')

运行发生上述的错误;利用ChatGPT排查原因:
在这里插入图片描述

小知识:

1、如何利用python来检测df中某一列的编码格式:

# pip install chardet
import chardet
import pandas as pd
#假设你的DataFrame名为df,包含中文字符的列名为'column_name'
df['column_name'] = df['column_name'].astype(str)  # 将列转换为字符串类型

# 遍历DataFrame中的每个字符串
for index, row in df.iterrows():
    data = row['column_name']
    result = chardet.detect(data.encode())
    encoding = result['encoding']
    confidence = result['confidence']
    print(f"String: {data} - Encoding: {encoding} - Confidence: {confidence}")
import pandas as pd

# 假设你的数据DataFrame名为df,列名为column_name
df[column_name] = df[column_name].apply(lambda x: x.encode('utf-8').decode('utf-8') if isinstance(x, str) else x)

# 现在,数据中的字符串应该都是UTF-8编码了

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐