从http://initd.org/tracker/pysqlite/wiki/pysqlite下载了SQLITE
的PYTHON绑定。并用WINDOWS下的sqlite3.exe创建了一个库一张表:
+++++++++++++++++++
-database: wanna
   -table name: hello
    -id      name
     ----    ---------
     0       帅哥
     1       wannachan
     2       dick.chan
     3       雯雯
+++++++++++++++++++

好了,建表成功了!下面开始PYSQLITE来操作此数据库了!心情那个激动啊~~
首先建立连接:
>>> from pysqlite2 import dbapi2 as sqlite
>>> con=sqlite.connect("g:\sqlite\wanna")
再启用cursor:
>>> cur=con.cursor()
激动人心的时刻到了!执行SQL:
----------------------------------------------
>>> cur.execute('select * from hello')

Traceback (most recent call last):
   File "<pyshell#24>", line 1, in <module>
     cur.execute('select * from hello')
OperationalError: Could not decode to UTF-8 column 'name' with text '帅哥'
----------------------------------------------

OH!NO!竟说我的‘帅哥’不能以UTF-8编码!咋办捏?咋办捏?!
上网查查看!看到有人用这个con=sqlite.connect("database",encoding='cp936')
我也试试,结果:
----------------------------------------------------------------
>>> con=sqlite.connect("g:\sqlite\wanna",encoding='cp936')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: 'encoding' is an invalid keyword argument for this function
----------------------------------------------------------------

看来以前用的版本才有encoding这参数,现在我的2.5版没有哇!看来只有看manual
了!于是俺万分不情愿地翻开MAN看了起来,原来是要指定text_factory才行!
于是俺试着抄它一句例子来试试:
>>> con.text_factory=lambda x: unicode(x, "utf-8", "ignore")
表示是用UTF8来编码取得RECORD,如果非UTF-8则ignore。俺心知自己的编码是GBK,
但也想看看会有什么错出现,于是继续:
----------------------------------------------
>>> cur=con.cursor()
>>> cur.execute('select * from hello')
<pysqlite2.dbapi2.Cursor object at 0x012984A0>
>>> rs=cur.fetchall()
>>> rs[0]
(0, u'')
>>> rs[1]
(1, u'wannachan')
>>> rs[2]
(2, u'dick.chan')
>>> rs[3]
(3, u'')
----------------------------------------------
可以看到,我的两项有中文的RECORD都由于编码不符被忽略成了u''了,这时我
心中看到了光明!下面用GBK(CP936)来编码试试:
----------------------------------------------
>>> con.text_factory=lambda x: unicode(x, "cp936", "ignore")
>>> cur=con.cursor()
>>> cur.execute('select * from hello')
<pysqlite2.dbapi2.Cursor object at 0x012984D0>
>>> rs=cur.fetchall()
>>> rs[0]
(0, u'\u9648\u67f1')
>>> u'\u9648\u67f1'
u'\u9648\u67f1'
>>> print rs[0][1]
帅哥
----------------------------------------------

HOHO!成功了一大步!这时我想,如果我指它UTF-8不IGNORE会怎么样?
说干就干:
----------------------------------------------
>>> con.text_factory=lambda x: unicode(x, "utf-8")
>>> cur=con.cursor()
>>> cur.execute('select * from hello')

Traceback (most recent call last):
   File "<pyshell#21>", line 1, in <module>
     cur.execute('select * from hello')
   File "<pyshell#19>", line 1, in <lambda>
     con.text_factory=lambda x: unicode(x, "utf-8")
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb3 in position 0:
unexpected code byte
----------------------------------------------

出错了!说明编码不MATCH真的不能用,那么如果我的RECORD有多种编码
咋办呢?于是我尝试用MANUAL上出现过的UNICODE OPTION来试试:
----------------------------------------------
>>> con.text_factory = sqlite.OptimizedUnicode

>>> cur=con.cursor()
>>> cur.execute('select * from hello')

Traceback (most recent call last):
   File "<pyshell#24>", line 1, in <module>
     cur.execute('select * from hello')
OperationalError: Could not decode to UTF-8 column 'name' with text '帅哥'
>>>
----------------------------------------------

TNND,竟然UNICODE也用UTF-8来ENCODE,这不是欺负人么?明知UTF-8存汉字占空间大的不行!
于是俺再仔细的看MANUAL,终于看到有个是以byteString的形式传回来的了。
俺想,这个不涉及到具体的ENCODING,应该就算有不同的CHARSET都不会有ERROR吧!
试试:
----------------------------------------------
>>> from pysqlite2 import dbapi2 as sqlite
>>> con=sqlite.connect("g:\sqlite\wanna")
>>> con.text_factory=str                     #str代表以byte string形式return
>>> cur=con.cursor()
>>> cur.execute('select * from hello')
<pysqlite2.dbapi2.Cursor object at 0x00BDBB30>
>>> rs=cur.fetchall()
>>> rs[0][1]
'\xb3\xc2\xd6\xf9'
>>> print rs[0][1]
帅哥
----------------------------------------------

HAHA!成功了!得到了BYTECODE STRING,就可以按指定的编码来解码它,就可以
得到正确的输出了!
看看上面那个BYTECODE STRING '\xb3\xc2\xd6\xf9',试着给它解码:
>>> '\xb3\xc2\xd6\xf9'.decode('cp936')
u'\u9648\u67f1'

果然得到了一个UNICODE串了,俺再判断它是否等于我们预期的字串?

>>> _ == u'帅哥'
True
>>> u'帅哥'
u'\u9648\u67f1'

很明显是一样的串!OK,解决了!

最后的想法:
1,如果在text_factory=str之前,俺把str定义成了一个变量,override了它作
为<type 'str'>的这个身份,那会不会出错呢?
2,喜欢用PYTHON,就是因为它的中文问题总是那么容易解决,想将编码怎么转
换就怎么转换!一点也不含糊!

原文:http://hi.baidu.com/wannachan/blog/item/24be12d16b7b5dd2572c848a.html

转载于:https://www.cnblogs.com/changyou/archive/2010/01/08/1642309.html

PYSQLITE用法初探相关推荐

  1. SAP WM Movement Type 里的‘Ref.Stor.Type Search’字段用法初探

    SAP WM Movement Type 里的'Ref.Stor.Type Search'字段用法初探 笔者在目前的项目里负责MM以及WM两个模块的实施.根据客户仓库存储区域的现状,我在WM层面的st ...

  2. freeze用法初探

    记得最初在Carbide C++里见到"Freeze"这个词的时候只是感到好奇,Freeze("冻结"),是干什么用的?不过这份好奇感当时在我的脑袋中存活了不超 ...

  3. 使用tensorflow-serving部署tensorflow模型

    使用docker部署模型的好处在于,避免了与繁琐的环境配置打交道.使用docker,不需要手动安装Python,更不需要安装numpy.tensorflow各种包,直接一个docker就包含了全部.d ...

  4. linux 通配符 正则表达式 区别,linux 正则表达式和通配符

    linux 正则表达式和通配符 通配符用于查找文件 包含三种:  * ? [] * 代表任意个任意字符 ? 代表任意一个字符 [] 代表中括号中的一个字符 正则表达式(正则是包含匹配,只要包含就可以匹 ...

  5. DataBinding初探 数据绑定的用法 ,import 集合类型,绑定的表达式,访问集合类型2...

    数据绑定的用法 import语法 <data> <import type="android.view.view"/> </data> 如果类名相 ...

  6. 初探Git git基本用法

    Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库 mkdir project # 创建项目目录 cd project # 进入到项目 ...

  7. Codewars一些积累No.3 从罗马数字编码器来初探string的实用用法

    文章目录 1.开头 2.具体先看题目内容 1)要求 2)例子 3.我的又一次头秃探索 1)认识罗马数字计数方法 2)认识基本string操作 1.字符串的生成 2.字符串的大小和容量 3.string ...

  8. dva的用法_dva.js初探

    dva是一个在redux和redux-saga的基础上封装的一个轻型框架,能辅助更好的组织代码进行开发.同时提供了react-router和fetch,基本上具备了开发web前端应用所需的主要工具,省 ...

  9. SAP HUM 嵌套HU初探

    SAP HUM 嵌套HU初探 SAP HUM (Handling Unit Management) 子模块里,提供了在系统里对于HU(包装单元)的管理功能.HUM子模块支持业务部门对于相关的物料的打包 ...

最新文章

  1. dubbo部分常见的面试题目
  2. 每日程序C语言30-static作用
  3. 几张旧照片,用傻瓜拍的,翻出来凑数 (续)
  4. 博客园客户端UAP开发随笔 -- App连接云端内容的桥梁:WebView
  5. ios设计登录功能_亲爱的产品设计师,这是iOS 14的新功能
  6. Numpy 数组操作
  7. 集群节点数和分片数关系_Elasticsearch最佳实践之分片使用优化
  8. Jenkins在Windows下的安装与配置
  9. vc2005运行库彻底卸载_VC2005运行库-解决方案
  10. 2023年辽宁大学原子与分子物理考研上岸前辈备考经验指导
  11. XSS靶场练习手工注入(1)
  12. 【机器学习面经】AI算法岗位简历必备
  13. 魔方机器人需要特制魔方吗_大开眼界:会玩魔方的机器人
  14. 柠檬班的课程怎么样,来自一个金融行业转行到软件测试行业的故事
  15. 目前主流微型计算机显卡总线接口是,江苏省2011年普通高校对口单招文化统考计算机专业综合理论试卷B...
  16. 大数据工程师岗位JD中最常出现的技能
  17. anti-SG 游戏
  18. 猿创征文 | 专做药品生产研发的程序员
  19. 安装arosics做自动几何校正
  20. iOS开发Implicit declaration of function 'XXXX' is invalid in C99” 报错问题

热门文章

  1. 人是需要一个圈子互相激励的
  2. 创业者:永远站着顾客这边
  3. 如果买一辆二手的劳斯莱斯在三线城市跑婚车,多久能回本?
  4. iPhone11用第三方的快充,电池健康度会下降很快吗?
  5. 利用管道实现进程间同步
  6. azure云数据库_在Azure SQL数据库中配置电子邮件通知
  7. 在SQL Server Management Studio(SSMS)中调试存储过程
  8. sql server 转发_SQL Server中的转发记录性能问题
  9. 测试需要了解的技术之基础篇四__UI自动化测试体系
  10. [工具向]__关于androidstudio工具使用过程中学习到的一些知识点简记