我有一個 Sqlite 資料庫,它在某些字串中獲得了 NUL 位元組。我想用 '\0' 替換那個 NUL 位元組,以便我知道該字串包含一個 NUL 位元組,并且 NUL 位元組后面的所有內容都是可見的。這是我從作業中繼承的資料庫。我沒有把這件事弄得一團糟,我只需要處理它。
我試過類似的東西:
iif(instr(Message, char(0)) = 0
, Message
, substr(Message, 1, instr(Message, char(0)))
|| "\0"
|| substr(Message, instr(Message, char(0))-length(Message) 1)
)
但似乎我實際上無法訪問 NUL 之外的字串。
看起來substr并且length會將字串視為 NUL 終止,并且不會到達實際字串的末尾。LENGTH(CAST(Message AS BLOB))我可以通過使用(這很好,因為我們只使用 UTF8 中的 7 位字符)來獲取實際字串的長度,但這不涉及substr哪些不超過 NUL(轉發( ve 開始位置)或向后(-ve 開始位置))。
有沒有辦法解決這個問題?
順便說一句,我知道 NUL 可以被剝離,但這會洗掉 NUL 之后的所有內容。可以在此處找到該資訊。從那里我得到了上面的想法。
我也試過:
replace(Message, char(0), "\0")
這也沒有用。
uj5u.com熱心網友回復:
您需要使用substr()獲取 0 位元組之前的部分,然后再次獲取之后的部分 - 但這僅適用于 blob,而不適用于文本,因此需要強制轉換:
sqlite> CREATE TABLE foo(bar);
sqlite> INSERT INTO foo VALUES ('apple' || char(0) || 'bacon');
sqlite> SELECT * FROM foo;
bar
-----
apple
sqlite> SELECT length(CAST(bar AS BLOB)) FROM foo;
length(CAST(bar AS BLOB))
-------------------------
11
sqlite> SELECT substr(bar, 1, instr(bar, char(0)) - 1) || '\0' || substr(CAST(bar AS blob), instr(bar, char(0)) 1) AS bar FROM foo;
bar
------------
apple\0bacon
sqlite>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490816.html
