Строки SQLite с NUL - PullRequest
       31

Строки SQLite с NUL

3 голосов
/ 29 октября 2010
  1. Могут ли строки в SQLite 3 содержать NUL символов?
  2. Если ответом на 1 является «да», как их можно записать в запросах SQL?SQLite, похоже, не имеет функций chr или char.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

В общем, нет - SQLite внутренне не является 8-битным чистым, вероятно, из-за его наследия Tcl.Хотя NUL не вызывают проблем с повреждением, SQLite обычно останавливает обработку строк с первым встроенным символом NUL.

Это верно даже для таких операторов, как GLOB.Например, вы не можете сопоставить столбец BLOB с GLOB, если ввели встроенные NUL-символы, например, этот

select * from table where blobcol glob x'00022a';

будет соответствовать только пустым значениям BLOB-объектов: хотя вы можете использовать буквальный синтаксис BLOB (например, x'hexdigits') и использовать полученные значения там, где используются строки, SQLite обычно использует только часть перед первым NUL.

Как минимум ,.это состояние дел вплоть до включения SQLite 3.26.0.

Обратите внимание, что SQLite также имеет тип BLOB, который может хранить встроенные NUL без каких-либо проблем, но в SQLite очень мало функциональных возможностей для их использования, иих часто труднее использовать из библиотек интерфейса SQL.

Они также бесшумно преобразуются в строки во многих контекстах, после чего встроенные NUL снова начинают вызывать проблемы.

0 голосов
/ 29 октября 2010

Не уверен, с какой версии он поддерживается, но вы можете сделать это:

create table foo (bar data);
insert into foo(bar) values (x'001122334400ff');
select length(bar),hex(bar),bar from foo;
...