一、环境及问题描述

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

(完)

最新文章

  1. Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
  2. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
  3. VS Code - Debugger for Chrome调试JavaScript的两种方式
  4. ASP.NET Repeater 绑定 DropDownList Calendar 选择日期
  5. 混合式APP开发中中间件方案Rexsee
  6. MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]
  7. JS正则表达式基础总结
  8. mybatis10 实现类代理对象开发
  9. cocos2d_android开发简单游戏
  10. VS快捷键大全(转)
  11. windows下使用批处理调用exe和服务
  12. 杭电 1272 POJ 1308 小希的迷宫
  13. Ambari-部署文档
  14. 浅析DES与AES、RSA三种典型加密算法的比较
  15. H5与C3权威指南笔记--transition动画
  16. Solr 06 - Solr中配置使用IK分词器 (配置schema.xml)
  17. pom样板
  18. 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...
  19. Spark With Mongodb 实现方法及error code -5, 6, 13127解决方案
  20. 4.struts2的配置文件优先级

热门文章

  1. Vim技能修炼教程(17) - 编译自己的Vim
  2. how to play
  3. 小谈python装饰器及numba的基本使用
  4. Linux 环境下 javac 编译错误: 编码UTF8的不可映射字符 (编码UTF8/GBK的不可映射字符)
  5. 配置Yaf
  6. MySQL 主从复制与读写分离
  7. windows常用DLL及作用
  8. pthread调度策略,优先级和竞争范围
  9. tasks
  10. javascript系列--Object.assign实现浅拷贝的原理以及实现