如何解决python连接数据库编码问题(python传数据到mysql乱码)'ascii' codec can't encode _mysql_exceptions.OperationalError: (1366, "Incorrect string value:?
首先描述下问题:
在使用python计算出结果后将结果插入到mysql过程中,报如下错误。原因很好定位就是编码的问题。那么到底是编码哪里出了问题了呢?
报错如上:

排查顺序:
第一:python的编码

自己的代码,发现打开的时候的确已经制定了编码?那么问题应该不是在python的编码问题。
同时采用:

打印出word[5] 又发现会报错 ASCii 不识别等错误。于是再这里纠结了很久很久。终于把打印问题解决了。
解决办法:如果要打印出正常的中文,在程序开头加上这么一段代码 即可:
python 脚本
import io
import sys
from urllib.request import urlopen
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
注意:上面的代码,仅仅能解决在打印的时候打印出中文。
如果没有上面的代码,会报如下错误:
python报错代码:
Traceback (most recent call last):
File "/data/codes/run.py", line 46, in <module>
pre(sys.argv[2], sys.argv[3], sys.argv[4], clean_run=False, **optional)
File "/data/codes/matrix/preprocess.py", line 30, in pre
preprocess(job.input_file(), timestamp)
File "/data/codes/matrix/job/preprocess.py", line 23, in preprocess
for record in load_data(filename):
File "/data/codes/matrix/data/DataLoader.py", line 75, in load_data
print(words[3])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
总之:你会发现不是python的错误,而应该是插入到mysql里面发生了错误,那么我们去找mysql的编码问题问题。
第二:Mysql数据库的编码
我们都知道,mysql编码的时候默认是 lati1编码。但是更多时候我们会把他换成utf-8。
于是普遍的,我们在建完数据库,会做编码的修改,例如:
mysql代码:
set character_set_client=utf8;
set character_set_results=utf8;
set character_set_connection=utf8;
set character_set_database=utf8;

但是,我想很郑重的告诉你,你以为这样就真的万事大吉了,你以为这样再出现问题就不是mysql的问题了。
你会想,我都设置成了 utf-8 还会出现什么问题呢?
接下来我们看看,设置完上面之后我的数据库中的的一个表

看到么?里面的表的编码还是latin1。
于是,我们得出结论是,如果你在建立表之后才修改myslq 的编码,那么原来建的边的编码不会发生变化。要让其变化必须进行更加确切的编码指定,例如用下面的语句
:
mysql代码:
alter table BETWEENNESS character set utf8;·
这个时候你可能会认为这样就完成了,but,python的运行下,错误仍然会继续报错。
我们这个时候再看看数据库表的编码类型:

恶心不恶心,你把表的编码都改好了,却发现字段的编码还是默认的Latin1。亲爱的latin1你是有多么的爱我,舍不得我。
从上面的报错,我们能看到,主要原因是我的 ‘semantic’字段报的错。
于是下面这个代码解决了问题:
mysql代码:
alter database matrix character set utf8;
alter table BETWEENNESS change semantic semantic varchar(32) character set utf8 not null;
alter table BETWEENNESS character set utf8;

直到这个时候,问题彻底解决了。latin1终于不见了。
总结: 在你需要的数据库建立之前就将所有的编码都设置mysql 代码
set character_set_client=utf8;
set character_set_results=utf8;
set character_set_connection=utf8;
set character_set_database=utf8;
一旦你已经在为做任何编码改动的时候把表和数据库已经建立好的话,那么执行上面的代码后,前面建立的表的各种编码似乎改变好像要看运气,哈哈。严格的说不是运气,我对数据库不是很熟悉,所以不知道具体原因。
但是一旦你发生了上面的问题。就是先建立了数据库和表,需要更改编码的时候。请将以前建立的数据库和表,通过确切的具体的方式把他们的编码修改过来。
例如:
alter table <表名> character set utf8;
alter table <表名> change <字段名> <字段名> <类型> character set utf8;
alter table user change username username varchar(20) character set utf8 not null;
分享一个关于改变mysql'编码的文章:http://www.cnblogs.com/shootercheng/p/5836657.html
-----------------------------------------------------------------------------华丽丽的分割线------------------------------------------------------------------------------------------------------------
说说感想:
这个小的问题,我折腾了两天,感觉有一肚子的气要说出来,真正写出来的时候觉得问题就是那么简单,高手也许半个小时就解决了,只是觉得自己很笨。
第一天和第二天的一半时间都以为是python的问题,在找各种python编码转中文的问题,感觉百度的文章都被我找遍了。找的过程中还考虑了python版本的问题,发现有些函数在2.7使用,3.5就不适用了。例如下面的代码:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
3.5版本的会告诉你 不认识reload函数
回到前面,如果要打印中文就加上如下脚本
python 脚本
import io
import sys
from urllib.request import urlopen
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
如果读文就加上:
open(filename, 'r', encoding="utf8") as reader:
我们再回到mysql编码:
总之还是要细心,当python和mysql对接的时候请注意检查:
1. 确保数据库编码为 `utf-8`
2. 确保数据库表的编码为`utf-8`
3. 确保数据库字段编码为 `utf-8`
4.程序连接数据库指定编码:`MySQLdb.connect("localhost","root","***","Data",charset='utf8')`
5.文本的编码问题也应该统一。
参考网址:http://blog.csdn.net/shomy_liu/article/details/47681893
关键词“细心”。
如何解决python连接数据库编码问题(python传数据到mysql乱码)'ascii' codec can't encode _mysql_exceptions.OperationalError: (1366, "Incorrect string value:?的更多相关文章
- python报OperationalError: (1366, "Incorrect string value..."的问题解决
一.环境及问题描述 1. 环境 操作系统:win10,64bit. python版本:2.7.15 mysql版本:5.7.23 2. 问题描述 使用python从某个数据文件读取数据,处理后,用My ...
- 转 Python——UnicodeEncodeError: 'ascii' codec can't encode/decode characters
转自: http://blog.csdn.net/zuyi532/article/details/8851316 我是写爬虫的时候遇到的问题,百度了一下,先贴解决方案: 在代码中加入: import ...
- MySQL:1366 - Incorrect string value错误解决办法
今天使用navicat向MySQL中插入中文时,报错: - Incorrect string value:... 在我自己数据库设计之初,没有设计好字符编码格式的问题. 使用如下语句解决: alter ...
- python 编码报错问题 'ascii' codec can't encode characters 解决方法
python在安装时,默认的编码是ascii, 当程序中出现非ascii编码时,python的处理常常会报这样的错 'ascii' codec can't encode characters pyth ...
- 解决python编码问题报错:'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)
这个问题很奇怪,在服务器上执行一个写数据库的python文件,正常执行,但是使用java的ssh进行调用脚本,发现就是不执行数据库的写入,然后使用了try except的方式,打印了错误信息,发现报错 ...
- [转]Python UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法 python在安装时,默认的编码是ascii,当 ...
- python 编码问题:'ascii' codec can't encode characters in position 的解决方案
报错: 'ascii' codec can't encode characters in position 8-50: ordinal not in range(128) Python在安装时,默认的 ...
- Python编码问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(12
今天安装了PyScripter编辑器,刚要写代码,突然就出现异常: <span style="font-size:14px;color:#ff0000;">>&g ...
- Python 排错UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法
Python UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法 by:授客 QQ:1033553122 错误描述: py ...
随机推荐
- js 小数计算时出现多余的数据
根据资料显示:是由于十进制换算成二进制,处理后,再由二进制换算成十进制时,造成的误差. 得出:所以(0.1+0.2)!=0.3 而是=0.30000000000000004的结果 解决方法: 参考:h ...
- css常见的概念
padding-top:10px;是指容器内的内容距离容器的顶部有10个像素,是包含在容器内的: margin-top:10px;是指容器本身的顶部距离其他容器有10个像素,不包含在容器内: top: ...
- spark的shuffle和原理分析
概述 Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂. 在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段 ...
- libco协程库上下文切换原理详解
缘起 libco 协程库在单个线程中实现了多个协程的创建和切换.按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行.而li ...
- BZOJ3211:花神游历各国(线段树)
Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 ...
- [TJOI2013]拯救小矮人
题目 首先有一个很假的贪心 我们定义一个人的需求为\(H-h_i-b_i\),就是这个人需要多少的高度在他下面他才能逃出去 我们趁剩余的高度还够,优先满足需求较高的 显然是错的,可能有一个人身高很高, ...
- [POI2007]MEG-Megalopolis
传送门:嘟嘟嘟 第一反应是树链剖分,但是太长懒得写,然后就想出了一个很不错的做法. 想一下,如果我们改一条边,那么影响的只有他的子树,只要先搞一个dfs序,为什么搞出这个呢?因为有一个性质:一个节点的 ...
- tomcat 使用 cronolog 切割日志
1. 下载 cronolog 软件 wget http://cronolog.org/download/cronolog-1.6.2.tar.gz cronolog-.tar.gz tar zxvf ...
- [luogu4072] 征途
题面 题意体面中写得很明确, 应该不用我说了, 方差的概念在初中人教版九年级数学中有所提到, 没有上过初中的同学们可以左转百度. 将序列拆为几段求最值, 我们考虑用dp来实现. 先推一下式子, 令方差 ...
- aips初步设想
2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...