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

一、环境及问题描述

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

时间: 2024-10-06 08:27:32

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

1366, "Incorrect string value: '\\xF0\\x9F\\x91\\x89\\xE3\\x80...' for column 'content' at row 1"

问题描述:Python从网站中抓取网页文本保存到MySQL数据中,对应数据库字段为longtext,字符编码utf-8.部分插入成功,部分插入失败,报错如下.1366, "Incorrect string value: '\\xF0\\x9F\\x91\\x89\\xE3\\x80...' for column 'content' at row 1" 是因为mysql不能识别4个字节的utf8编码的字符,抛出了异常,这应该也是问题的根源.?.??.类似于这种4个字节,将对应字符类型换成

Error Code: 1366 - Incorrect string value: '***' for *** row 1

今天处理一个报障问题,执行mysql更新脚本时报错: Error Code: 1366 - Incorrect string value: '\xB3\xAC\xCA\xD0\xBB\xDD...' for column 'ChangecdtionName' at row 1 反复分析,查找网络上相似错误的解决办法,找不到好的方法. 知道这是编码问题,报的错误:1.查看了mysql数据库的编码为utf-8 2.查看了centos系统的编码为:LANG=zh_CN.UTF-8 这奇怪了,都是utf

MySQL报错“1366 - Incorrect integer value: '' XXXXXXX' at row 1 ”

出现这个错误是因为我在表中插入了一条含有中文字符的语句: 修改方法: my.ini中查找sql-mode 将 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", 修改为 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", 重启mysql后即可 . MySQL报错"1366 - Incorrect int

MySQL 更新中文列:1366 Incorrect string value 问题解决

环境:mysql-5.6.25-winx64,MySQL workbench 问题:MySQL更新时出现异常: warning(s): 1366 Incorrect string value: '\xE8\x82\x96\xE5\xB1\xB1...' for column 'sub_station_name' 解决: 1.数据库schema字符集设置为utf-8 2.表字符集设置为utf-8 3.中文列字符集设置为utf-8 4.连接url里面已经指定了CharsetEncode=utf8 第

【Mysql】存储emoji表情报错(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')的解决方案

普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题.涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点 Mysql 版本的限制,Mysql 5.5.3之前的版本,支持的utf8为3字节的,Mysql 5.5.3之后的版本支持utf8mb4 修改mysql的配置文件,windows下的为my

mysql 存储 emoji报错( Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

1.报错原因: mysql utf-8 编码储存的是 2-3个的字节,而emoji则是4个字节. 2.解决办法: 修改mysql的配置文件,windows下的为my.ini(linux下的为my.cnf),修改的内容都一样. [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server

SQL语句报错:Incorrect string value: '\xE9\x98\xBF\xE6\x96\xAF...'

很明显是编码的问题.检查了一下$conn->query("set names utf8");已经加在代码里了.那莫非是数据库编码不是utf8? 看了一下 还真不是 于是右键要修改的表,点击alter table,做了如下修改. 不报任何期望的重启了服务器又试了一次 果然还是那个错.... 这种场面我见多了,早就看淡了.所以接着排查问题. 发现在SQL语句复制到数据库执行也是这个亚子,中文用命令添加完全不行,但是手动添加却是正常的: 听网上的把编码改成utf8mb4依然不行 然后!

Mysql中关于 错误 1366 - Incorrect string value: ‘\xE5\xBC\xA0\xE4\xB8\x89‘ for column ‘name‘ at row 1

原文:Mysql中关于 错误 1366 - Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1 在向数据库中添加英文测试数据时没问题,但是添加中文测试数据时发现一个错误:1366 - Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1. 解释为:1366 - 字符串值不正确:第1行的列'na

django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'

今天把之前的一些代码转移到另外一台电脑的时候, python manage.py syncdb 的时候报了 (1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...' 的错误,查了一下,应该是数据库编码设置的问题,看了一下本机数据库的默认编码,果然如此 mysql> show variables like "%char%"; +--------------------------+-------