python报OperationalError: (1366, "Incorrect string value..."的问题解决

本文详细解析了在使用Python向MySQL数据库插入数据时遇到的OperationalError编码问题,介绍了utf8与utf8mb4的区别,提供了修改数据库编码的具体步骤,并分享了处理特殊字符编码的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境及问题描述

1. 环境

操作系统:win10,64bit。

python版本:2.7.15

mysql版本:5.7.23

2. 问题描述

使用python从某个数据文件读取数据,处理后,用MySQLdb去连接数据库表并插入数据,此时报错:

OperationalError: (1366, "Incorrect string value..."

网上可以查到是编码问题:

出现这个异常是mysql问题,而非python的问题,这是因为mysql的字段类型是utf-xxx, 而在mysql中这些utf-8数据类型只能存储最多三个字节的字符,而存不了包含四个字节的字符。

因为之前的数据库的字符集是utf8,所以需要转为utf8mb4编码。

不幸的是,我装的mysql版本很老,是5.4的版本,而utf8mb4编码在5.5.3后才支持,于是只能重装mysql,重新装的是5.7.23的版本。

 

二、关于utf8mb4编码

MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用utf8也就够了。

既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。

三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。

 

三、问题解决

1. 数据库编码修改

修改my.ini的内容:

[client] 
default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4 
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'

将数据库和已经建好的表也转换成utf8mb4:

ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

更改表编码:

ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

重启mysql服务。

如果这个时候已经解决问题,可以不用往下看了。

否则,可以看看下面的思路能否为你提供一点想法。

我的情况是依旧没有解决问题。

 

2. 从读取文件的编码入手

发现数据文件的编码是gb2312,所以读取一行内容后需要转为unicode然后再转为utf8:

line = line.decode('gbk').encode('utf-8')

(奇怪的是用’gb2312’就不行)

至此问题解决。

所以可以看出实际上我遇到的问题只是读取的编码在写入mysql的时候不能识别而已,后面我新建一个表,默认编码为utf8,也能正常插入,这也验证了这个想法。

 

四、参考

1. python插入数据到mysql时报错:mysql

2. utf8mb4与utf8的区别

3. 更改MySQL数据库的编码为utf8mb4

(完)

转载于:https://www.cnblogs.com/harrymore/p/9440414.html

### 回答1: SQLAlchemy.exc.OperationalError: (pymysql.err.OperationalError) 是一个数据库操作错误,通常是由于数据库连接问题或语法错误引起的。这个错误可能会导致应用程序无法正常工作,需要及时解决。常见的解决方法包括检查数据库连接配置、检查SQL语句是否正确、检查数据库是否正常运行等。 ### 回答2: Sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError)是一种在使用Sqlalchemy库时可能出现的错误,通常意味着连接数据库时出现了一些问题。这种错误可能会导致某些数据库操作无法顺利完成。 要分析这个错误,需要考虑以下几个方面: 1. 数据库连接问题:这种错误可能是由于数据库连接出现了问题。例如,可能是因为数据库停机、网络故障、数据库登录信息有误等原因导致的。解决问题需要检查数据库连接信息是否正确,是否能够正常连接数据库。 2. 权限问题:有时,该错误也可能是因为SQLAlchemy库没有足够的访问权限而导致的。这可能是由于数据库管理员在设置数据库访问权限时限制了某些用户的权限。解决问题需要检查是否已授予SQLAlchemy库足够的权限。 3. SQL 语句问题:这种错误也可能由于SQL语句存在某种问题导致的。可能是由于SQL语法错误、查询条件错误、列名或表名错误等等。解决问题需要检查SQL语句的正确性,并确保SQL语句符合SQLAlchemy库的要求。 总之,要解决Sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError)错误,需要综合考虑上述问题,并对具体情况进行逐一排查和解决。在排查可能原因时,可以通过错误日志或其他工具来进行诊断和调试。 ### 回答3: sqlalchemy.exc.operationalerror: (pymysql.err.operationalerror)是发生在使用SQLAlchemy的过程中的一个异常错误,它通常是由于连接数据库时出现问题导致的。 具体来说,这个错误通常是由于以下几种情况引起的: 1.数据库连接超时:在进行数据库操作时,如果连接超时,就会导致出现这个错误。这种情况下,可以尝试调整连接超时时间或增加数据库服务器资源。 2.网络中断或数据库服务器宕机:当网络发生故障或数据库服务器宕机时,也会导致这个错误。这种情况下,可以检查网络连接或重启数据库服务器来解决问题。 3.数据库权限不足:在进行数据库操作时,如果当前用户没有足够的权限进行该操作,就会出现这个错误。这种情况下,可以检查数据库授权或更改当前用户权限来解决问题。 4.SQL语句错误:在执行SQL语句时,如果语法错误或逻辑错误,也会导致这个错误。这种情况下,可以检查SQL语句是否正确或优化SQL语句来解决问题。 总之,如果出现sqlalchemy.exc.operationalerror: (pymysql.err.operationalerror)错误,首先需要检查数据库连接是否正常,同时还要注意检查SQL语句和数据库权限等方面的问题,才能找到解决方法并消除错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值