Что означает x’0a’ в SQL?

#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
w

бд<>скрипка <>здесь

Комментарии:

1. Я бы также добавил, что в этом контексте || это не оператор или , а конкатенация строк

2. Обратите внимание, что в последних версиях SQLite вы можете писать char(10) вместо этого, что имеет преимущество работы в базах данных с кодировкой UTF-16 (в противном случае для записи новой строки требовалось бы, чтобы она была записана как x'000a' ).