#python #sql #sqlite #flask
Вопрос:
В настоящее время я работаю над официальным учебником по Flask, и есть некоторый SQL, с которым я никогда раньше не сталкивался, который остается необъяснимым. Я понимаю, что мы вставляем значения в таблицу post и что для body
мы вставляем или 'test'
, или x'0a'
, или 'body'
. Что это x'0a'
значит? Является x
ли какой — то спецификатор формата? Я поискал в Интернете, но не нашел ничего полезного.
INSERT INTO post (title, body, author_id, created)
VALUES
('test title', 'test' || x'0a' || 'body', 1, '2018-01-01 00:00:00');
Ответ №1:
Это не на SQL, а на каком-то определенном диалекте SQL. Согласно коду в этой статье, это SQLite. Итак, из документации:
Литералы больших двоичных объектов-это строковые литералы, содержащие шестнадцатеричные данные, которым предшествует один символ «x» или «X». Пример: X’53514C697465′
Таким образом, это литерал большого двоичного объекта, содержащий символ перевода строки (LF, новая строка).
select 'q' || x'0a' || 'w' as tst
tst |
---|
q w |
бд<>скрипка <>здесь
Тем не менее, это специфично для SQLite (и я не совсем понимаю внутренние компоненты SQLite, но в других СУБД потребуется неявное преобразование типов), поэтому вы можете просто поместить новую строку в текст, понятный для любой СУБД (и hex
возвращает для нее ту же кодовую точку, как показано ниже):
select 'q w' as tst, hex(' ') as what_is_newline
tst что это за новая строка q
w0А
бд<>скрипка <>здесь
Комментарии:
1. Я бы также добавил, что в этом контексте
||
это не оператор или , а конкатенация строк2. Обратите внимание, что в последних версиях SQLite вы можете писать
char(10)
вместо этого, что имеет преимущество работы в базах данных с кодировкой UTF-16 (в противном случае для записи новой строки требовалось бы, чтобы она была записана какx'000a'
).