如何使用Unicode字母声明SQL INSERT语句



我有一个sql语句,其中包含一个特定于unicode的符号。unicode符号在波兰语单词PrzesuniÉcie中为É。请查看以下SQL INSERT语句:

INSERT INTO res_bundle_props (res_bundle_id, value, name) 
VALUES(2, 'Przesunięcie przystanku', 'category.test');

我在Postgres数据库工作。我可以用哪种方式插入带有unicode字母的波兰语单词?

查找服务器和客户端的编码:

show server_encoding;
 server_encoding 
-----------------
 UTF8
show client_encoding;
 client_encoding 
-----------------
 UTF8

然后将客户端设置为与服务器相同的编码:

set client_encoding = 'UTF8';
SET

不需要特殊语法,只要:

  • 您的server_encoding包含这些字符(如果是utf-8,则包含)
  • 您的client_encoding包括这些字符
  • 您的client_encoding与实际发送的字节的编码正确匹配

后者经常让人绊倒。他们认为他们可以用SET client_encoding语句更改client_encoding,这将进行某种神奇的转换。事实并非如此。client_encoding告诉PostgreSQL"这是您将从客户端接收的数据的编码,也是客户端希望从您接收的编码"。

client_encoding设置为utf-8不会使客户端实际发送UTF-8。这取决于客户。您也没有发送utf-8;该字符串也可以用iso-8859-2iso-8859-4iso-8859-10以及其他编码来表示。

至关重要的是,您要告诉服务器您发送的数据的编码。碰巧,字符串在上述三种编码中都是相同的,ę编码为0xae。。。但是在utf-8中,这将是两个字节CCD_。如果您将utf-8发送到服务器并告诉它它是iso-8859-2,则服务器无法判断您错了,并将在iso-8859-2中将其解释为Ä

所以。。。实际上,这取决于系统的默认编码、读取数据的任何文件/流的编码等。您有两个选项:

  • 为正在处理的数据和系统的默认显示区域设置适当的client_encoding。这对于简单的情况来说是最容易的,但在处理输入或输出中的多个不同编码时就更难了。

  • client_encoding设置为utf-8(或与server_encoding相同),并确保在发送之前始终将所有输入数据转换为client_encoding设置的编码。您还必须将从Pg接收的所有数据转换回。

最新更新