[问题] 从数据库读取中文乱码及空值如何进数据库

楼主: wanget   2018-05-12 01:36:14
最近想要把csv档或是网络上的档案连结直接写进数据库,感觉终于到了最后一步 却翻遍
了google都解决不了问题
环境是pythob 3.6.1 ,anaconda 4.4.0
我在jupyter notebook下执行,使用pyodbc连接MySQL
资料来源是网址或是csv档,我比较习惯用pandas来处理资料
这是我连接数据库的方法
cn = pyodbc.connect("DRIVER={MySQL ODBC 8.0 ANSI Driver}; SERVER=localhost;
PORT=3306;DATABASE=db; UID=root; PASSWORD=0000;OPTION=3;CHARSET=UTF8;")
cn.setencoding(encoding='utf-8') 这行也不需要了
[解决方法]:
DRIVER 需选择 Unicode 的版本,从Python连接数据库取出资料才不会变成乱码
我不太确定在.connect下放CHARSET=UTF8; 和设定.setencoding(encoding='utf-8')有什
么不一样,但是只要少放一个,在insert into时如果有中文,jupyter notebook就会卡
住,都要shutdown kernel再重开才能继续
现在有个问题就是 我可以顺利的新增含有中文的资料到数据库了,而且在MySQL中select
出来是中文,但是到了python就会变成乱码,请问我该怎么解决?

还有个问题就是,我的资料里面有空值,我写了个循环 配合 .format,让他逐行新增资
料,但是空值读出来是nan,没办法新增
如果是数字字段的话,我可以把nan转成NULL,新增进MySQL就可以是空的,但是如果是文
字的字段,新增的时候会变成'NULL'而不是空值了
因为我用这样的形式新增资料
for i in df1.index:
cursor.execute("insert into taichung_201711 values('{}', {});" \
.format(df1.loc[i][6], df1.loc[i][7]))
如果是字串的字段,一开始就给他''了,要是把NaN改成NULL,就会变成'NULL'进数据库
有方法可以直接把空值存进MySQL吗?
这里我还是把空值都转成 'NULL'进数据库,之后调资料出来再转回nan,
目前都用DataFrame处理资料 还没发生问题
恳请各位大大指教了
作者: uranusjr (←這人是超級笨蛋)   2018-05-12 09:36:00
听起来你 MySQL 本身的编码就没设对
楼主: wanget   2018-05-12 13:54:00
MySQL编码是 utf8md4 应该没有问题" target="_blank" rel="nofollow">
还是要改成utf8呢?
作者: uranusjr (←這人是超級笨蛋)   2018-05-13 22:10:00
实在不太熟 ODBC 不确定问题在哪, 不过直觉还是觉得和数据库设定有关, 可能要确定你的 table 真的是用 UTF-8 建不过 utf8md4 是正确的没错, 千万不要用 utf8
楼主: wanget   2018-05-13 23:00:00
再次附上查出来的编码和测试 " target="_blank" rel="nofollow">
开头都是utf8但后面不太一样,可是不管哪种 在python都是乱码,我这次是在MySQL中建表 顺便设定collation
作者: uranusjr (←這人是超級笨蛋)   2018-05-14 16:25:00
你查的是数据库的默认编码, 和表的不见得一样, 不过听你的测试法应该是有建新表, 那么应该是用这些没错 (希望)这样最可能的两个问题就是 1. 进去的编码不对 2. 读出来后印到萤幕上的结果不对; 你需要想办法用 binary 把数据库里的值印出来, 比对它是不是真的是正确的编码结果
楼主: wanget   2018-05-15 16:52:00
" target="_blank" rel="nofollow">
show table status;查出来的应该是表的编码吗? 从MySQL新增资料查询都没问题,到了python才有问题,问题会是出在连线吗? 我换个套件测试看看进去的编码不对,和用binary把值印出来 我google还是不会解决。 不过还是谢谢uranusjr大大的回复我把中文字段拿出来.encode('utf8') 发现他是bytes的形式我改用pymysql连接数据库后,可以正常的显示中文了! 我想可能是pyodbc的问题

Links booklink

Contact Us: admin [ a t ] ucptt.com