当文本是希伯来语时,无法构造 PostgreSQL 数组文字

Posted

技术标签:

【中文标题】当文本是希伯来语时,无法构造 PostgreSQL 数组文字【英文标题】:Unable to construct PostgreSQL array literal when text is in Hebrew 【发布时间】:2017-03-12 23:49:25 【问题描述】:

我正在编写一个 Node.js 程序,用于下载文本数组并将其保存到带有 text[] 列的 PostgreSQL 表中。当我收到数组时,我将其转换为数组文字

    /**
     * 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 中插入一组希伯来语文本?或者我需要打破数组并单独插入每个字符串(这有效)?

【问题讨论】:

【参考方案1】:

您没有在字段中转义双引号,并且您的希伯来语文本在 קק"ל 中使用双引号 U+0022 QUOTATION MARK,这会弄乱您的数组文字。如果它是一个 gershayim,它应该是字形 ״ (U+05f4),但它也可以是 ֞,如果它的目的是作为一个双分符号而不是标点符号。

这是有道理的,因为根据 Google 的说法,קק"ל 似乎是 JNF(犹太国家基金),这是 gershayim 标记的首字母缩略词。有人懒惰并输入了错误的字形,它应该是 קק״ ל.对吧?

与普通的 SQL 标识符引用不同,Pg 数组字面量使用反斜杠引用,所以你可以这样写:

"קק\"ל",קקל,יער,ייעור,"פורטל השטחים הפתוחים","קרן קיימת לישראל",יערות,צומח,תצורות

(如果您使用支持 RTL 的浏览器,您会在" 之后看到反斜杠,但它实际上是在字节顺序之前)。

但是,除了修复转义问题外,我建议您切换到使用带有普通 SQL 文字的数组构造函数形式:

test=> SELECT ARRAY['קק"ל','קקל','יער','ייעור','פורטל השטחים הפתוחים','קרן קיימת לישראל','יערות','צומח','תצורות'];
                                        array                                        
-------------------------------------------------------------------------------------
 "קק\"ל",קקל,יער,ייעור,"פורטל השטחים הפתוחים","קרן קיימת לישראל",יערות,צומח,תצורות
(1 row)

我不会说或读希伯来语,所以这一切都是基于一些快速的研究。希望对您有所帮助。

【讨论】:

好收获。我按照你的建议切换到ARRAY[],一切都像魅力一样! @HaoliangYu 你意识到你仍然需要引用这些值,对吧?否则,如果用户输入中包含',您将遇到同样的问题。顺便说一句,我对标点符号是否正确?

以上是关于当文本是希伯来语时,无法构造 PostgreSQL 数组文字的主要内容,如果未能解决你的问题,请参考以下文章

使用希伯来语输入进行文本框验证

如何从 C# ASP.NET 参数将希伯来语文本发送到 SQL Server?

希伯来语 PayPal 按钮中文本不正确的问题

Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)

编辑搜索栏中的文本时出现 UISearchBar 问题

Android 设置与 TextView 的希伯来语文本?