Python SQLite插入空字符

Python SQLite插入空字符,python,sqlite,null,byte,Python,Sqlite,Null,Byte,因此,我正在用Python(2.7)编写一个脚本,转换文件,然后将结果存储在SQlite数据库中 对于主键,我使用文件的最后29个字节(因为它包含唯一标识符)。问题是这些唯一标识符包含空btyes(x00),因此当我尝试插入“40 00 00 00 00 3F F0 00 00 00 00 00 00 00 00 05”时,它只会以“40”结束(@) 我怎样才能让SQlite停止截断它?我尝试使用文本,BLOB,空,无,以及sqlite3.binary(插入时),但都只返回“@” 下面是我用来插

因此,我正在用Python(2.7)编写一个脚本,转换文件,然后将结果存储在SQlite数据库中

对于主键,我使用文件的最后29个字节(因为它包含唯一标识符)。问题是这些唯一标识符包含空btyes(x00),因此当我尝试插入“
40 00 00 00 00 3F F0 00 00 00 00 00 00 00 00 05
”时,它只会以“
40
”结束(
@

我怎样才能让SQlite停止截断它?我尝试使用
文本
BLOB
,以及
sqlite3.binary
(插入时),但都只返回“
@

下面是我用来插入的语句和我正在使用的测试表

CREATE TABLE files (id blob PRIMARY KEY);
cur.execute("INSERT INTO files (id) VALUES (?)", (sqlite3.binary(tid), ))
编辑:好吧,我只是个白痴。。。我从来没有想过要选择它,因为在sqlite3 CLI中它看起来就像一个“@”…(temp.txt只包含文件的最后29位)

win32上的Python 2.7.13(v2.7.13:a06454b1afa1,2016年12月17日,20:42:59)[MSC v.1500 32位(英特尔)] 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。 >>>导入sqlite3 >>>conn=sqlite3.connect('kp_trans.db') >>>cur=连接光标() >>>打开(“temp.txt”,“rb”)作为f: ... cur.execute(“从id=?”的文件中选择*,(sqlite3.Binary(f.read()),) ... 对于cur中的行: ... 打印行[0] ... @ ?≡ ☺ ♣ >>>
如果您设法以字节(而不是字符,在
open
语句中使用
'rb'
)的形式读取这些文件的内容,然后以字节的形式捕获最后29个字节,就像下面的代码一样,那么我认为sqlite可能不会损坏它们

>>> id = b'40\00\00\00\00\00\00\00\00\3F\F0\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\05'
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> c.execute('CREATE TABLE files (id blob PRIMARY KEY)')
<sqlite3.Cursor object at 0x0000000005600CE0>
>>> c.execute("INSERT INTO files (id) VALUES (?)", (id, ))
<sqlite3.Cursor object at 0x0000000005600CE0>
>>> for rec in c.execute('SELECT * FROM files'):
...     rec
...     
(b'40\x00\x00\x00\x00\x00\x00\x00\x00\x03F\\F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x05',)

插入文件(id)值(“40 00 00 00 00 3F F0 00 00 00 00 00 00 00 01 00 05”)对我有效。但它是存储为blob还是字符串?我认为,如果您想要一个blob,它应该被插入到文件(id)值('X400000…')中,通过发出以下命令检查数据库实际拥有什么:selectid,typeof(id),hex(id);使用SQLite3命令行工具。这只是十六进制中的一个示例。请尝试b'\x40\x00\3f'(因为它是以二进制模式从文件中读取的),它只会插入'\x40'致@varro第二条评论-@|blob|40000366
>>> id = b'40\00\00\00\00\00\00\00\00\3F\F0\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\05'
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> c.execute('CREATE TABLE files (id blob PRIMARY KEY)')
<sqlite3.Cursor object at 0x0000000005600CE0>
>>> c.execute("INSERT INTO files (id) VALUES (?)", (id, ))
<sqlite3.Cursor object at 0x0000000005600CE0>
>>> for rec in c.execute('SELECT * FROM files'):
...     rec
...     
(b'40\x00\x00\x00\x00\x00\x00\x00\x00\x03F\\F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x05',)
>>> bytearray(id)
bytearray(b'40\x00\x00\x00\x00\x00\x00\x00\x00\x03F\\F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x05')