[Python]sqlite3二进制文件存储问题(BLOB)(You must not use 8-bit bytestrings unless you use a text_factory...)

事情是这样的:

博主尝试用Python的sqlite3数据库存放加密后的用户名密码信息,表是这样的

CREATE TABLE IF NOT EXISTS user
			(
			userID INTEGER PRIMARY KEY AUTOINCREMENT,
			userStudentID BLOB NOT NULL UNIQUE ON CONFLICT IGNORE,
			userPassword BLOB NOT NULL
			);

其中userStudentID and UserPassword 储存成了BLOB类型,作为二进制存储。

但当博主把加密后的字节串插入数据库时,却报出如下错误:

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

显然它把博主的字节串当成了未经编码的字符串。此时不能参考它的做法,把text_factory 置为 str,这样的话博主的密文就会被编码存放(如utf-8),而如果有些字节无法按utf-8编码的话,就会引发异常或被忽略。

网上搜了好多文章,均没有解决博主的问题。

后来还是找到了Official Document

https://docs.python.org/2/library/sqlite3.html#module-sqlite3

原来Python中与sqlite3的BLOB对应的数据类型为buffer,博主惊出一身冷汗,忙看了下自己的插入部分的代码:

def insertUsernameAndPasswordToDB(conn, cu, username, password):
	username = encrypt(username)
	password = encrypt(password)
	cu.execute("INSERT INTO user(userStudentID, userPassword) VALUES (?,?)", (username, password) )
	conn.commit()

测试了下username和password的数据类型

print isinstance(username, str)
print isinstance(password, str)

结果均为True,怪不得sqlite3尝试把他们按字符串的形式存储。这里又涉及一个知识,sqlite3用的是动态的数据类型系统,它会按照数据的值来尝试将数据转换成数据库内部的标准类型。这里它就尝试将我的字节串密文转换成字符串。

参考资料:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2137000.html

将username和password转换成buffer类型,问题解决。

def insertUsernameAndPasswordToDB(conn, cu, username, password):
	username = encrypt(username)
	password = encrypt(password)
	cu.execute("INSERT INTO user(userStudentID, userPassword) VALUES (?,?)", (buffer(username), buffer(password)) )
	conn.commit()

微博:@浙大宋博

[Python]sqlite3二进制文件存储问题(BLOB)(You must not use 8-bit bytestrings unless you use a text_factory...),布布扣,bubuko.com

时间: 2024-10-18 15:19:48

[Python]sqlite3二进制文件存储问题(BLOB)(You must not use 8-bit bytestrings unless you use a text_factory...)的相关文章

python+sqlite3

一个小例子, # -*- coding:utf-8 -*- ''' Created on 2015年10月8日 (1.1)Python 2.7 Tutorial Pt 12 SQLite - https://www.youtube.com/watch?v=Ll_ufNL5rDA (1.2) sqlite3.connect(":memory:") 这个是亮点. (1.3) [Python] 74 Creating a database with SQLite 3 - https://ww

Python sqlite3模块的text_factory属性的使用方法研究

写这篇文章,起源于要写一个脚本批量把CSV文件(文件采用GBK或utf-8编码)写入到sqlite数据库里. Python版本:2.7.9 sqlite3模块提供了con = sqlite3.connect("D:\\text_factory.db3") 这样的方法来创建数据库(当文件不存在时,新建库),数据库默认编码为UTF-8,支持使用特殊sql语句设置编码 PRAGMA encoding = "UTF-8"; PRAGMA encoding = "U

python sqlite3 数据库操作

SQLite3是python的内置模块,是一款非常小巧的嵌入式开源数据库软件. 1. 导入Python SQLite数据库模块 import sqlite3 2. python sqlite3模块的API """ sqlite3.connect(database [,timeout ,other optional arguments]) 该 API 打开一个到 SQLite 数据库文件 database 的链接.您可以使用 ":memory:" 来在 RA

初学Python写二进制文件

初学Python写二进制文件 把一个图片的16进制数据保存到一个txt文本,从这个txt文本读出并保存为二进制文件jpg图片文件.说明:图片读出的0xff粘贴ff到文本中,读出时是字符串的"ff". 我主要是用C语言,python为初学,python的编码思想还是用C的思想. 一.C的实现: #include <stdio.h> #include <string.h> /******************************* 函数名:DSP_2_HEX

python sqlite3使用详解

Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它使用一个文件存储整个数据库,操 作十分方便.它的最大优点是使用方便,功能相比于其它大型数据库来说,确实有些差距.但是性能表现上,SQLITE并不逊色.麻雀虽小,五脏俱全, sqlite 实现了多数 sql-92 的标准,比如说 transaction . trigger 和复杂的查询等. python的数据库模块有统一的接口标准,所以数据库操作都有统一的模式,基本上都是

Sqlite3中存储类型和数据类型结合文档解析。

sqlite3是个很小的数据库,运行在手机,机顶盒上....那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它定义了很多数据类型,其实不是他就5个存储类,那么多数据类型是根据一整套严谨的规则映射的!!还有什么char,varchar其实都是没有的..下面将结合文档详细讲解,相信看完你会了解更多,其实主要就是翻译文档.... sqlite官网:http://www.sqlite.org/ Sqlite3数据类型 大多数的数据库引擎(到现在据我们所知的除了sqli

sqlite3数据存储

1.打开数据库 函数 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 **ppDb          // 数据库实例 ); 示例 // path是数据库文件的存放路径 sqlite3 *db = NULL; int result = sqlite3_open([path UTF8String], &db); 代码解析: sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库.如果res

python数据的存储和持久化操作

Python的数据持久化操作主要是六类:普通文件.DBM文件.Pickled对象存储.shelve对象存储.对象数据库存储.关系数据库存储. 普通文件不解释了,DBM就是把字符串的键值对存储在文件里: Python代码 % python >>> import anydbm >>> file = anydbm.open('movie', 'c') # make a DBM file called 'movie' >>> file['Batman'] =

python中级----&gt;pymongo存储json数据

这里面我们介绍一下python中操作mangodb的第三方库pymongo的使用,以及简单的使用requests库作爬虫.人情冷暖正如花开花谢,不如将这种现象,想成一种必然的季节. pymongo的安装及前期准备 一.mangodb的安装以及启动 测试机器:win10, mangodb版本v3.4.0,python版本3.6.3. mangodb的安装目录:D:\Database\DataBase\Mongo.数据的存放目录:E:\data\database\mango\data.首先我们启动m