python访问sqlite3中文数据

tim_spac 2008-07-30 04:26:42
一个简单应用使用SQLite ("SQLite version 3.5.8") 做DBMS,
有表cfg_citycode
sqlite> .schema cfg_citycode
CREATE TABLE cfg_citycode (
code char(8) PRIMARY KEY,
name varchar(32)
);
其中name字段存放内容为中文字符
sqlite> select * from cfg_citycode limit 10;
0|国内其他
00|国际其他
001|美加地区
001242|巴哈马
001246|巴巴多斯
001264|安圭拉岛
001268|安提瓜和巴布达
001284|英属维尔京群岛
001286|安提瓜和巴布达
001340|美属维尔京群岛
...


用python编程访问:

IDLE 1.2.2
>>> import sqlite3
>>> conn = sqlite3.connect("..\\DAT\\boss.sqlite")
>>> curr = conn.cursor()
>>> curr.execute("select * from cfg_citycode limit 10;")

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
curr.execute("select * from cfg_citycode limit 10;")
OperationalError: Could not decode to UTF-8 column 'name' with text '国内其他'
>>>

I need help.

...全文
2967 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑夜愁客 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 keyser 的回复:]

conn = sqlite3.connection(" ... ")
conn.text_factory = str

设置python使用什么类型来处理sqlite3的text类型,默认是unicode,所以才会产生
OperationalError: Could not decode to UTF-8 column 'name' with text '国内其他'
这个错误

……
[/Quote]这个很管用的哦
Keyser 2008-11-05
  • 打赏
  • 举报
回复
conn = sqlite3.connection(" ... ")
conn.text_factory = str

设置python使用什么类型来处理sqlite3的text类型,默认是unicode,所以才会产生
OperationalError: Could not decode to UTF-8 column 'name' with text '国内其他'
这个错误

因为从数据库中取出数据时,是gbk编码(因为你上次存进去的是gbk)
conn.text_factory的默认值是unicode,python会尝试将text类型的字段转换成unicode,就产生了错误
tim_spac 2008-08-06
  • 打赏
  • 举报
回复
问题已经解决,确实是GBK编码问题。
方法是用python读取,用str.decode("gbk")后再写入sqlite库。
以后读取时用str.encode("gbk")再做转换。
只是这种方法写完库,不能在sqlite3的命令行中直接阅读中文信息。即出现一种矛盾:
gbk编码可以直接在sqlite中处理,但python读取存在问题;
utf-8编码python可以正常处理,但sqlite中无法阅读。

该矛盾可有解决方案?
iambic 2008-08-04
  • 打赏
  • 举报
回复
你的是gkb编码。把文件编码转换成utf-8。
tim_spac 2008-08-04
  • 打赏
  • 举报
回复
to iambic:

cfg_citycode.txt
0,国内其他
00,国际其他
001,美加地区
001242,巴哈马
001246,巴巴多斯
001264,安圭拉岛
...
用16进制查看文件内容:
30 2C B9 FA C4 DA C6 E4 CB FB 0D 0A 30 30 2C B9
FA BC CA C6 E4 CB FB 0D 0A 30 30 31 2C C3 C0 BC
D3 B5 D8 C7 F8 0D 0A 30 30 31 32 34 32 2C B0 CD
B9 FE C2 ED 0D 0A 30 30 31 32 34 36 2C B0 CD B0
CD B6 E0 CB B9 0D 0A 30 30 31 32 36 34 2C B0 B2
...
这应该是什么编码呢?
iambic 2008-08-02
  • 打赏
  • 举报
回复
>cfg_citycode.txt
这个文件里的数据是什么编码?
Semigod 2008-08-02
  • 打赏
  • 举报
回复
你可以再做一个测试,就是通过python向sqlite中写入一串unicode字符串,然后比较这个字符串与原来库中现有字符串的存储上的差别。我想你现有的字符串应该不是unicode编码在存储进去的,而是直接以GBK格式存进去。
tim_spac 2008-08-02
  • 打赏
  • 举报
回复
首先非常感谢各位的指导。

关于各位的问题答复如下::
To:Aylazhang
TEXT也一样

To iambic:
sqlite>.load cfg_citycode.txt cfg_citycode

To Semigod:
SQLite version 3.5.8
Enter ".help" for instructions
sqlite> pragma encoding;
UTF-8
sqlite>
Semigod 2008-08-01
  • 打赏
  • 举报
回复
建议你在sqlite3中执行一下
pragma encoding;
看看输出是什么,是不是utf-8

根据你这个情况看来,你数据库中的中文字符应该是GBK编码的,而不是utf-8。所以你可能需要对你的数据库做个简单转换。如果不想动数据库的话,就让pysqlite以gbk编码去访问数据
iambic 2008-07-30
  • 打赏
  • 举报
回复
数据是怎么写进去的?
海楓 2008-07-30
  • 打赏
  • 举报
回复
中文編碼問題,不知道樓主的數據中文使用什麼編碼。
但還沒用python處理過數據問題。等其它兄弟來解答,占位拿分。
Aylazhang 2008-07-30
  • 打赏
  • 举报
回复
把name varchar(32)
改成text类型试试。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧