Как я могу преобразовать экранированную строку в байту в postgresql (\ не является бинарным ди git) с помощью Azure Data Studio - PullRequest
0 голосов
/ 29 марта 2020

Вероятно, это дубликат, но я не смог довольно долго выяснить, как это сделать.

Я просто пытаюсь выполнить обход двоичного значения. Я выбираю его, затем вставляю в другой запрос SQL.

Т.е.

  • У меня есть таблица со столбцами id, data
  • Я выполняю этот запрос в Azure Data Studio с расширением postgres: select id, data from mytable
  • Окно вывода показывает это
id  data
58  b'\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC'

Теперь я пытаюсь сделать второй запрос, где я считать вещи, соответствующие этому.

select count(*) from mytable where data = b'\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC'

И я получаю сообщение об ошибке "\" - недопустимый двоичный файл di git

Большинство документов и другие вещи, которые я обнаружил, предлагают синтаксис E'...'::bytea, поэтому я делаю это:

select count(*) from mytable where data = E'\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC'::bytea

И я получаю сообщение об ошибке неверная последовательность байтов для кодировки "UTF8": 0xaa

Я попробовал функцию decode, поскольку другие предположили, что:

select count(*) from mytable where data = decode('\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC', 'escape')

И это не удается из-за ошибки неверный синтаксис ввода для типа bytea

Почему выходной формат для двоичных данных не является допустимым форматом ввода? Надеюсь, это не просто странная Azure Data Studio: - (

Ответы [ 2 ]

1 голос
/ 29 марта 2020

При использовании шестнадцатеричных значений с decode() вам необходимо использовать опцию hex и указывать только действительные шестнадцатеричные числа:

decode('aab687', 'hex')

В качестве альтернативы вы можете использовать префикс шестнадцатеричных значений с single \x, например

'\xaab687'::bytea

Однако ваша строка содержит недопустимые шестнадцатеричные значения, например \x1ebd, \x924g и \x87|-x - не уверены, какими должны быть.

Синтаксис escape (например, с использованием E'...') требует восьмеричные значения , а не шестнадцатеричные числа, поэтому E'\xaa\xb6... должно быть E'\\252\\266.... То же самое верно при использовании опции 'escape' для decode()

0 голосов
/ 30 марта 2020

Это оказывается Azure Поведение Data Studio, а не спецификация c до postgresql.

Когда я выполняю тот же запрос, используя psql, я получаю разумно отформатированную шестнадцатеричную строку, которая отлично работает в запросах туда и обратно, это похоже на \xbc6b702a12f8adb482ad517eca5af6407c9f172091242aa79845a17b4d479e2d (обратите внимание на другое значение данных, но формат правильный)

Я подал проблему с надстройкой postgresql для Azure Data Studio и, надеюсь, это может быть решил таким образом.

Ссылка на проблему: https://github.com/microsoft/azuredatastudio-postgresql/issues/204

В качестве обходного пути мне нужно будет использовать select encode(column, 'hex') во всех моих запросах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...