#postgresql #escaping #string-literals
#postgresql #экранирование #строковые литералы
Вопрос:
Я создаю запрос PostgreSQL с помощью скрипта, который возвращает форматированные формулы LaTeX, окруженные двойными знаками доллара, например, следующую:
$$6 x^{14} frac{7 x^{13}}{5} frac{13 x^{8}}{7} frac{5 x^{5}}{6}$$
Более того, эти формулы принадлежат массиву, так что полный INSERT
запрос был бы примерно таким:
INSERT INTO table("array")
VALUES (
'{"$$6 x^{14} frac{7 x^{13}}{5} frac{13 x^{8}}{7} frac{5 x^{5}}{6}$$",
"$$frac{9 x^{11}}{13} frac{13 x^{9}}{7} x^{8} frac{x^{6}}{3}$$",
"$$2 x^{13} frac{52 x^{12}}{3} frac{65 x^{4}}{9} frac{3}{2}$$"}'
)
Однако после ВСТАВКИ обратная косая черта (
), которая предшествует frac
, исчезает в базе данных (я получаю frac
вместо frac
. Следовательно, мои формулы плохо отображаются в моем приложении.
Вот содержимое ячейки:
{"$$6 x^{14} frac{7 x^{13}}{5} frac{13 x^{8}}{7} frac{5 x^{5}}{6}$$",
"$$frac{9 x^{11}}{13} frac{13 x^{9}}{7} x^{8} frac{x^{6}}{3}$$",
"$$2 x^{13} frac{52 x^{12}}{3} frac{65 x^{4}}{9} frac{3}{2}$$"}
Я использую модуль sympy в Python для автоматической генерации формул, поэтому вручную удваивать обратную косую черту перед каждой frac
— не вариант.
Что я должен сделать, чтобы предотвратить подобное поведение?
Ответ №1:
Обратная косая черта — это экранирующий символ в строках, представляющих массив строк:
SELECT ('{a,"b"c\d"}'::text[])[2];
text
-------
b"cd
(1 row)
Если обратная косая черта не предшествует символу со специальным значением, она игнорируется.
Удвойте все обратные косые черты внутри строкового представления массива строк в PostgreSQL, чтобы получить то, что вы хотите.
Если такие обратные косые черты являются единственными, встречающимися в вашей строковой константе, вы могли бы поступить следующим образом:
SELECT replace(
'{"$$6 x^{14} frac{7 x^{13}}{5} frac{13 x^{8}}{7} frac{5 x^{5}}{6}$$",
"$$frac{9 x^{11}}{13} frac{13 x^{9}}{7} x^{8} frac{x^{6}}{3}$$",
"$$2 x^{13} frac{52 x^{12}}{3} frac{65 x^{4}}{9} frac{3}{2}$$"}',
'',
'\'
)::text[];
Комментарии:
1. Я думаю, было бы неплохо добавить к вашему ответу, как автоматически включать необходимые обратные косые черты, поскольку в вопросе указано, что добавление обратных косых черт вручную не было бы вариантом. Предполагая, что sympy вернет необработанные строки, можно использовать stringname.replace(‘\’, ‘\’) чтобы получить новую строку с добавленной обратной косой чертой.
2. Странно то, что содержимое ячейки, такое как
'Hello $$frac{x^{11}}{10} frac{4 x^{6}}{7}$$'
, принимается без каких-либо проблем. В этом случае сохраняется единственная обратная косая черта. Я подозревал, что это потому, что$$
не отображается в начале строки, но я могу ошибаться.3. В любом случае, я мог бы реализовать обходной путь, как вы предложили, с помощью
str()
приведения иreplace('\', '\\')
метода.4. Я добавил, как вы можете использовать
replace
в SQL для этого.5. Перечитывая ответ, кажется, что существует разная интерпретация обратной косой черты в строке ПО сравнению с массивом строк. Кто-нибудь сможет подтвердить?