Обновить запрос для добавления нулей в поле BLOB-объектов с помощью SQLiteStudio - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь добавить нули в поле BLOB-объектов в базе данных sqlite3.Я попробовал вот что:

UPDATE Logs
SET msg_buffer =  msg_buffer || zeroblob(1)
WHERE msg_id = 'F0'

Как видите, имя поля «msg_buffer», и я хочу добавить ноль байтов.Кажется, что оператор concat ||не работаетКак я мог этого добиться?

Ответы [ 2 ]

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

Читая документацию ссылку , опубликованную Гуги (3.2. Сходство выражений), мне удалось найти способ:

UPDATE Logs
SET msg_buffer =  CAST(msg_buffer || zeroblob(1) AS blob)
WHERE msg_id = 'F0'

Оператор CAST может взять выражение с конкатенациейоператор и принудительное сродство BLOB-объектов.

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

SQLite3 поддерживает типы данных. Смотри https://www.sqlite.org/datatype3.html

Они не связаны строго с объявленным типом столбца, а скорее индивидуальны для каждого значения ячейки. Тип определяется тем, как он был создан / изменен. Например, если вы вставите 5, это будет INTEGER. Если вы вставите 5.5, это будет РЕАЛЬНО. Если вы вставите 'test', это будет TEXT, если вы вставите zeroblob (1), это будет BLOB, а если вы добавите null, это будет NULL.

Теперь вы пытаетесь объединить текущее значение с типом BLOB. Если текущим значением является TEXT (или, по сути, если вы используете оператор ||, как вы это делаете, вы конвертируете любой тип в TEXT), оно будет объединено с байтом \ x00, который фактически определяет конец строки. Другими словами, вы добавляете еще один терминатор строки к уже существующему типу TEXT.

Не будет никаких изменений на выходе этой операции. TEXT всегда заканчивается нулем байта и всегда исключается из результата, так как это метасимвол, а не само значение.

Дополнительная информация от http://sqlite.1065341.n5.nabble.com/Append-data-to-a-BLOB-field-td46003.html - добавление двоичных данных в поле BLOB невозможно. Вы можете изменить предварительно выделенный BLOB-объект:

Добавить невозможно. Но если вы предварительно выделите место с помощью zeroblob () или аналогичный, вы можете написать в него, используя API BLOB-объектов:

http://www.sqlite.org/c3ref/blob_open.html

Наконец, смотрите принятый ответ, так как автор вопроса нашел интересное решение.

...