Какие символы необходимо экранировать, чтобы получить допустимый строковый литерал SQLite? - PullRequest
0 голосов
/ 04 ноября 2019

Документация SQLite гласит:

Строковая константа формируется путем заключения строки в одинарные кавычки ('). Одиночная кавычка в строке может быть закодирована путем помещения двух одинарных кавычек в строку - как в Паскале. Экранирование в стиле C с использованием символа обратной косой черты не поддерживается, поскольку они не являются стандартными SQL.

Очевидно, этого недостаточно для реализации метода, который возвращает для любой входной строки aвыходная строка b такая, что ее можно без каких-либо дополнительных манипуляций безопасно интерполировать в SQL-запрос, такой как

select * from names where name = $b;

. Очевидно, что один шаг при переходе от a к bзаменить каждое вхождение ' (одинарная кавычка) на '' (две одинарные кавычки), и что в качестве последнего шага необходимо добавить начальную и конечную одинарные кавычки. Тем не менее, не ясно, как обрабатывать критические символы, такие как переводы строки, поскольку в документации просто говорится, что экранирование не разрешено;также не ясно, какие символы могут вызывать проблемы.

Примечание Мне известен один из стандартных ответов на такие вопросы, как «не убегай, используй привязку параметров», которая, какэто, вероятно, правильная вещь;тем не менее, я работаю с интерфейсом, который не позволяет мне формулировать кортежи SQL values, поэтому я должен сам придумать решение.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Я только что проверил фактические символы новой строки и табуляции между одинарными кавычками, и он работал правильно, вставляя эти символы в поле базы данных.

Единственным символом, вызывающим проблемы, является 0-байтовый код (т. Е. Символ NUL).

Согласно sqlite docs :

Строки со встроенными символами NUL не могут быть представлены в SQL как строковые литералы, и, следовательно, возвращаемый строковый литерал усекается до первого NUL.

0 голосов
/ 04 ноября 2019

Предполагается, что действует PRAGMA encoding="UTF-8";, единственные (Unicode) символы, которые нужно учитывать, это одинарные кавычки и NULL (U + 0000).

Если вы хотите, чтобы экранирование Юникода заменялось соответствующими символами, вы можете использовать функцию SQLite json_extract. Вот несколько примеров:

Входные данные:

select 'a
b'; 

select 'é';

select json_extract('"\u00e9"','$');

Выходные данные:

a
b
é
é

NUL

Буквенные NUL, по-видимому, исчезают при использовании команды sqlite3. строка приглашения в том смысле, что:

select length('a' || 'x^@y' || 'b'); -- where ^@ stands for NUL
4

Однако, используя другой метод ввода:

 select ('a' || 'x�y' || 'b');
 ax�yb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...