SQLite插入空字符

时间:2017-05-09 15:23:35

标签: python sqlite null byte

所以我在Python(2.7)中编写一个脚本来转换文件,然后将结果存储在SQlite DB中。

对于主键,我使用文件的最后29个字节(因为它包含唯一标识符)。问题是这些唯一标识符包含空btyes(x00)所以当我尝试插入" 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"它最终只是" 40"(@)。

如何让SQlite停止截断?我已尝试使用TEXTBLOBNULLNONEsqlite3.binary(插入时),但所有人都只返回&#34 ; @&#34 ;.

以下是我用于插入的声明和我正在使用的测试表。

CREATE TABLE files (id blob PRIMARY KEY);
cur.execute("INSERT INTO files (id) VALUES (?)", (sqlite3.binary(tid), ))

编辑:好的,所以我只是一个白痴......它只是我从未想过SELECT语句,因为在sqlite3 CLI中它看起来像一个& #34; @" ...(temp.txt只包含文件的最后29位)

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect('kp_trans.db')
>>> cur = conn.cursor()
>>> with open("temp.txt", 'rb') as f:
...      cur.execute("SELECT * FROM files WHERE id = ?", (sqlite3.Binary(f.read()), ))
...      for row in cur:
...            print row[0]
...
<sqlite3.Cursor object at 0x02346920>
@          ?≡                    ☺ ♣
>>>

1 个答案:

答案 0 :(得分:0)

如果您设法将这些文件的内容读作字节(而不是字符,在'rb'语句中使用open),然后将最后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',)

编辑:我还应该提到sqlite3已将id转换为bytearray。您需要考虑到这一点。

>>> 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')