作者wanget ()
看板Python
标题[问题] 从资料库读取中文乱码及空值如何进资料库
时间Sat May 12 01:36:14 2018
最近想要把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就会变成乱码,请问我该怎麽解决?
https://imgur.com/a/1yL0qxW
还有个问题就是,我的资料里面有空值,我写了个回圈 配合 .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处理资料 还没发生问题
恳请各位大大指教了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.242.11.7
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1526060186.A.017.html
1F:→ uranusjr: 听起来你 MySQL 本身的编码就没设对 05/12 09:36
2F:→ wanget: MySQL编码是 utf8md4 应该没有问题 05/12 13:54
4F:→ wanget: 还是要改成utf8呢? 05/12 13:55
5F:→ wanget: 今天发现了新问题,MySQL中只是看起来是中文,但要查询时 05/13 15:52
6F:→ wanget: 却查不出来 05/13 15:52
7F:→ wanget: 又来更新问题: MySQL可以正常查询 我之前搞错了 05/13 21:26
8F:→ uranusjr: 实在不太熟 ODBC 不确定问题在哪, 不过直觉还是觉得和资 05/13 22:10
9F:→ uranusjr: 料库设定有关, 可能要确定你的 table 真的是用 UTF-8 建 05/13 22:10
10F:→ uranusjr: 不过 utf8md4 是正确的没错, 千万不要用 utf8 05/13 22:10
12F:→ wanget: 开头都是utf8但後面不太一样,可是不管哪种 在python都是 05/13 23:02
13F:→ wanget: 乱码,我这次是在MySQL中建表 顺便设定collation 05/13 23:02
14F:→ uranusjr: 你查的是资料库的预设编码, 和表的不见得一样, 不过听你 05/14 16:25
15F:→ uranusjr: 的测试法应该是有建新表, 那麽应该是用这些没错 (希望) 05/14 16:25
16F:→ uranusjr: 这样最可能的两个问题就是 1. 进去的编码不对 2. 读出来 05/14 16:27
17F:→ uranusjr: 後印到萤幕上的结果不对; 你需要想办法用 binary 把资料 05/14 16:27
18F:→ uranusjr: 库里的值印出来, 比对它是不是真的是正确的编码结果 05/14 16:28
20F:→ wanget: 应该是表的编码吗? 从MySQL新增资料查询都没问题,到了py 05/15 16:53
21F:→ wanget: thon才有问题,问题会是出在连线吗? 我换个套件测试看看 05/15 16:54
22F:→ wanget: 进去的编码不对,和用binary把值印出来 我google还是不会 05/15 16:55
23F:→ wanget: 解决。 不过还是谢谢uranusjr大大的回覆 05/15 16:55
24F:→ wanget: 我把中文栏位拿出来.encode('utf8') 发现他是bytes的形式 05/15 20:53
25F:→ wanget: 我改用pymysql连接资料库後,可以正常的显示中文了! 我 05/16 00:01
26F:→ wanget: 想可能是pyodbc的问题 05/16 00:01
※ 编辑: wanget (111.242.1.76), 05/23/2018 16:04:24