Хорошо, основываясь на dbfiddle, я вижу, в чем проблема.(Кстати, там не нравится указание доллара, поэтому вы не можете запустить его. Вам просто нужно заменить $$
на '
, чтобы заключить его в строку, и он будет работать.)
Ваш ввод '{"(c:\\\\\\\rs\\me, Path, lang)"}'
.Это массив типа.
Давайте рассмотрим простой тип: CREATE TYPE public.t AS (txt TEXT)
.Когда вы выбираете тип в виде строки, а не с расширенными полями, любые «специальные» символы будут экранированы.
Итак: SELECT ROW('C:\temp')::public.t
возвращает ("C:\\temp")
, а расширение его с помощью SELECT (ROW('C:\temp')::public.t).*
возвращает C:\temp
.
Ваш ввод является строкой (он использует запись (data1,data2,etc)
, котораяряд буквальный и нерасширенный), поэтому все обратные слэши экранированы.Часть пути вашей расширенной строки (SELECT ('(c:\\\\\\\rs\\me, Path, lang)'::public.filenotification_input).*
) будет иметь вид c:\\\rs\me
.
Однако есть еще один уровень экранирования: факт, что данные находятся в массиве.Как и в случае нерасширенной строки, специальные символы будут экранированы в массиве.Выполнение SELECT ARRAY['C:\temp']
возвращает ["C:\\temp"]
.
Сложите их вместе, и у вас есть обратные слэши, нуждающиеся в экранировании в вашем ряду, и каждый из них затем должен экранироваться в массиве.Таким образом, чтобы получить одну обратную косую черту в «обычном» тексте, вы должны экранировать ее в строке (\\
), а затем экранировать каждую из них в массиве (\\\\
).
Таким образом, вам нужно 4 обратной косой черты, чтобы вставить одну обратную косую черту в вашу таблицу, учитывая способ, которым вы вводите свой ввод.
Запустите это и посмотрите на различные выходные данные: https://www.db -fiddle.com / ж / 83wBZsztETriNtZGDVXdcN / 0