当文本为希伯来语时无法构造 PostgreSQL 数组文字
Unable to construct PostgreSQL array literal when text is in Hebrew
我正在编写一个 Node.js 程序,用于下载文本数组并将其保存到带有 text[]
列的 PostgreSQL table 中。当我收到数组时,我将其转换为带有
的数组文字
/**
* Convert an array of values into a PostgreSQL array string.
* @param {Array} array JavaScript array
* @return {String} PostgreSQL array string
*/
function arrayToString(array) {
let values = _.chain(array)
.filter(value => value)
.map(value => {
return '"' + value.replace('\'', '\'\'').trim() + '"';
})
.join(',')
.value();
return '{' + values + '}';
}
此函数将字符串数组 ['test1', 'test2']
转换为 PostgreSQL 数组文字 {test1, test2}
。
它适用于多种语言,但不适用于希伯来语。虽然它可以生成数组文字,但结果对 PostgreSQL 无效。我看到这样的错误
error: malformed array literal: "{"קק"ל","קקל","יער","ייעור","פורטל השטחים הפתוחים","קרן קיימת לישראל","יערות","צומח","תצורות"}"
我也尝试在pgAdmin3中手动构造数组,但是pgAdmin3在处理希伯来字符方面有其自身的问题。
如何在 PostgreSQL 中插入一组希伯来语文本?或者我需要打破数组并单独插入每个字符串(这有效)?
您没有在字段中转义双引号,而您的希伯来文文本在 קק"ל
中使用双引号 U+0022 QUOTATION MARK
,这会弄乱您的数组文字。如果这意味着 gershayim 它应该是字形 ״
(U+05f4
),尽管它也可以是 ֞
如果它是一个双音符号而不是标点符号。
根据 Google,鉴于 קק"ל 似乎是 JNF(犹太国家基金会),这是有道理的,而且这是一个首字母缩写词,是 gershayim 标记的。有人偷懒,输入了错误的字形, 应该是 קק״ל 吧?
不同于普通的 SQL 标识符引用,Pg 数组文字使用反斜杠引用,所以你会写:
{"קק\"ל",קקל,יער,ייעור,"פורטל השטחים הפתוחים","קרן קיימת לישראל",יערות,צומח,תצורות}
(如果您使用的是支持 RTL 的浏览器,您会在 和 "
之后看到反斜杠 ,但实际上它在字节顺序之前)。
但是,除了修复转义问题外,我还建议您改用具有正常 SQL 文字的数组构造函数形式:
test=> SELECT ARRAY['קק"ל','קקל','יער','ייעור','פורטל השטחים הפתוחים','קרן קיימת לישראל','יערות','צומח','תצורות'];
array
-------------------------------------------------------------------------------------
{"קק\"ל",קקל,יער,ייעור,"פורטל השטחים הפתוחים","קרן קיימת לישראל",יערות,צומח,תצורות}
(1 row)
我不会说或读希伯来语,所以这一切都是基于一些快速的研究。希望对你有帮助。
我正在编写一个 Node.js 程序,用于下载文本数组并将其保存到带有 text[]
列的 PostgreSQL table 中。当我收到数组时,我将其转换为带有
/**
* Convert an array of values into a PostgreSQL array string.
* @param {Array} array JavaScript array
* @return {String} PostgreSQL array string
*/
function arrayToString(array) {
let values = _.chain(array)
.filter(value => value)
.map(value => {
return '"' + value.replace('\'', '\'\'').trim() + '"';
})
.join(',')
.value();
return '{' + values + '}';
}
此函数将字符串数组 ['test1', 'test2']
转换为 PostgreSQL 数组文字 {test1, test2}
。
它适用于多种语言,但不适用于希伯来语。虽然它可以生成数组文字,但结果对 PostgreSQL 无效。我看到这样的错误
error: malformed array literal: "{"קק"ל","קקל","יער","ייעור","פורטל השטחים הפתוחים","קרן קיימת לישראל","יערות","צומח","תצורות"}"
我也尝试在pgAdmin3中手动构造数组,但是pgAdmin3在处理希伯来字符方面有其自身的问题。
如何在 PostgreSQL 中插入一组希伯来语文本?或者我需要打破数组并单独插入每个字符串(这有效)?
您没有在字段中转义双引号,而您的希伯来文文本在 קק"ל
中使用双引号 U+0022 QUOTATION MARK
,这会弄乱您的数组文字。如果这意味着 gershayim 它应该是字形 ״
(U+05f4
),尽管它也可以是 ֞
如果它是一个双音符号而不是标点符号。
根据 Google,鉴于 קק"ל 似乎是 JNF(犹太国家基金会),这是有道理的,而且这是一个首字母缩写词,是 gershayim 标记的。有人偷懒,输入了错误的字形, 应该是 קק״ל 吧?
不同于普通的 SQL 标识符引用,Pg 数组文字使用反斜杠引用,所以你会写:
{"קק\"ל",קקל,יער,ייעור,"פורטל השטחים הפתוחים","קרן קיימת לישראל",יערות,צומח,תצורות}
(如果您使用的是支持 RTL 的浏览器,您会在 和 "
之后看到反斜杠 ,但实际上它在字节顺序之前)。
但是,除了修复转义问题外,我还建议您改用具有正常 SQL 文字的数组构造函数形式:
test=> SELECT ARRAY['קק"ל','קקל','יער','ייעור','פורטל השטחים הפתוחים','קרן קיימת לישראל','יערות','צומח','תצורות'];
array
-------------------------------------------------------------------------------------
{"קק\"ל",קקל,יער,ייעור,"פורטל השטחים הפתוחים","קרן קיימת לישראל",יערות,צומח,תצורות}
(1 row)
我不会说或读希伯来语,所以这一切都是基于一些快速的研究。希望对你有帮助。