在 PostgreSQL 中保存文件路径,删除反斜杠
Saving file path in PostgreSQL, removes backslashes
标题有问题。我们有一个 postgreSQL 数据库,我们想在其中保存一些路径,数据库从路径中删除反斜杠(\
)。
函数:
CREATE OR REPLACE FUNCTION public.add_filenotification_array(IN fninput public.filenotification_input [])
RETURNS Table(TYPE public."filenotification") AS
$$
DECLARE
fn public.filenotification_input;
filenotification public.filenotification;
filenotificationlist public.filenotification [];
BEGIN
FOREACH fn IN ARRAY fninput LOOP
INSERT INTO public."FileNotification"("FileLocation", "FileTargetLocation", "DocumentLanguage", "LastUpdate", "idStatus", "FileSize")
VALUES (fn.filelocation, fn.filetargetlocation, fn.documentlanguage, CURRENT_TIMESTAMP, 0, 0)
RETURNING "id", "FileLocation", "FileTargetLocation", "DocumentLanguage", "LastUpdate", "idStatus"
INTO filenotification.id, filenotification.filelocation, filenotification.filetargetlocation, filenotification.documentlanguage, filenotification.lastupdate, filenotification.idstatus;
filenotificationlist := array_append(filenotificationlist, filenotification);
END LOOP;
RETURN QUERY
SELECT * FROM unnest(filenotificationlist::public.filenotification []);
END;
$$
LANGUAGE plpgsql;
文件类型:
TYPE filenotification AS (
"id" integer,
"filelocation" character varying,
"filetargetlocation" character varying,
"documentlanguage" character varying,
"lastupdate" timestamp,
"idstatus" integer
);
TYPE filenotification_input AS (
"filelocation" character varying,
"filetargetlocation" character varying,
"documentlanguage" character varying
);
我们从应用程序发送 java.sql.Array
of filenotification
,在 filelocation
和 filetargetlocation
参数处使用正确的路径,结果完全没有反冲。我们的问题是:这是怎么回事?为什么要删除反斜杠?
编辑:如果我们将 4 个反斜杠放入函数参数中,那么它会输出 1 个反斜杠。如果我们将 8 个反斜杠放入函数参数中,那么它会输出 2 个反斜杠
好的,根据 dbfiddle,我可以看出问题所在。 (顺便说一句,它不喜欢在那里引用美元,这就是为什么你不能 运行 它。你只需要用 '
替换 $$
来将它作为字符串引用,并且它将 运行.)
您的输入是 '{"(c:\\\\rs\me, Path, lang)"}'
。它是一个类型的数组。
我们来看一个简单的类型:CREATE TYPE public.t AS (txt TEXT)
。当您 select 将类型作为一行而不是扩展字段时,任何 "special" 字符都将被转义。
所以:SELECT ROW('C:\temp')::public.t
returns ("C:\temp")
,并通过 SELECT (ROW('C:\temp')::public.t).*
returns C:\temp
.
扩展它
您的输入是一行(它使用 (data1,data2,etc)
表示法,这是行文字,未扩展),因此所有反斜杠都被转义。扩展行 (SELECT ('(c:\\\\rs\me, Path, lang)'::public.filenotification_input).*
) 的路径部分将是 c:\\rs\me
.
然而还有一层转义:数据在数组中这一事实。与未展开的行相同,特殊字符将在数组中转义。 运行宁SELECT ARRAY['C:\temp']
returns["C:\temp"]
.
将它们放在一起,您的行中有反斜杠需要转义,然后每个反斜杠都需要在数组中转义。因此,要在 "normal" 文本中获得单个反斜杠,您必须在行 (\
) 中对它进行转义,然后对数组 (\\
) 中的每个反斜杠进行转义。
所以您需要 4 个反斜杠才能在您的 table 中插入一个反斜杠,给定您提供输入的方式。
运行 并查看各种输出:https://www.db-fiddle.com/f/83wBZsztETriNtZGDVXdcN/0
标题有问题。我们有一个 postgreSQL 数据库,我们想在其中保存一些路径,数据库从路径中删除反斜杠(\
)。
函数:
CREATE OR REPLACE FUNCTION public.add_filenotification_array(IN fninput public.filenotification_input [])
RETURNS Table(TYPE public."filenotification") AS
$$
DECLARE
fn public.filenotification_input;
filenotification public.filenotification;
filenotificationlist public.filenotification [];
BEGIN
FOREACH fn IN ARRAY fninput LOOP
INSERT INTO public."FileNotification"("FileLocation", "FileTargetLocation", "DocumentLanguage", "LastUpdate", "idStatus", "FileSize")
VALUES (fn.filelocation, fn.filetargetlocation, fn.documentlanguage, CURRENT_TIMESTAMP, 0, 0)
RETURNING "id", "FileLocation", "FileTargetLocation", "DocumentLanguage", "LastUpdate", "idStatus"
INTO filenotification.id, filenotification.filelocation, filenotification.filetargetlocation, filenotification.documentlanguage, filenotification.lastupdate, filenotification.idstatus;
filenotificationlist := array_append(filenotificationlist, filenotification);
END LOOP;
RETURN QUERY
SELECT * FROM unnest(filenotificationlist::public.filenotification []);
END;
$$
LANGUAGE plpgsql;
文件类型:
TYPE filenotification AS (
"id" integer,
"filelocation" character varying,
"filetargetlocation" character varying,
"documentlanguage" character varying,
"lastupdate" timestamp,
"idstatus" integer
);
TYPE filenotification_input AS (
"filelocation" character varying,
"filetargetlocation" character varying,
"documentlanguage" character varying
);
我们从应用程序发送 java.sql.Array
of filenotification
,在 filelocation
和 filetargetlocation
参数处使用正确的路径,结果完全没有反冲。我们的问题是:这是怎么回事?为什么要删除反斜杠?
编辑:如果我们将 4 个反斜杠放入函数参数中,那么它会输出 1 个反斜杠。如果我们将 8 个反斜杠放入函数参数中,那么它会输出 2 个反斜杠
好的,根据 dbfiddle,我可以看出问题所在。 (顺便说一句,它不喜欢在那里引用美元,这就是为什么你不能 运行 它。你只需要用 '
替换 $$
来将它作为字符串引用,并且它将 运行.)
您的输入是 '{"(c:\\\\rs\me, Path, lang)"}'
。它是一个类型的数组。
我们来看一个简单的类型:CREATE TYPE public.t AS (txt TEXT)
。当您 select 将类型作为一行而不是扩展字段时,任何 "special" 字符都将被转义。
所以:SELECT ROW('C:\temp')::public.t
returns ("C:\temp")
,并通过 SELECT (ROW('C:\temp')::public.t).*
returns C:\temp
.
您的输入是一行(它使用 (data1,data2,etc)
表示法,这是行文字,未扩展),因此所有反斜杠都被转义。扩展行 (SELECT ('(c:\\\\rs\me, Path, lang)'::public.filenotification_input).*
) 的路径部分将是 c:\\rs\me
.
然而还有一层转义:数据在数组中这一事实。与未展开的行相同,特殊字符将在数组中转义。 运行宁SELECT ARRAY['C:\temp']
returns["C:\temp"]
.
将它们放在一起,您的行中有反斜杠需要转义,然后每个反斜杠都需要在数组中转义。因此,要在 "normal" 文本中获得单个反斜杠,您必须在行 (\
) 中对它进行转义,然后对数组 (\\
) 中的每个反斜杠进行转义。
所以您需要 4 个反斜杠才能在您的 table 中插入一个反斜杠,给定您提供输入的方式。
运行 并查看各种输出:https://www.db-fiddle.com/f/83wBZsztETriNtZGDVXdcN/0