所以我在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停止截断?我已尝试使用TEXT
,BLOB
,NULL
,NONE
和sqlite3.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>
@ ?≡ ☺ ♣
>>>
答案 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')