我有一个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-2
、iso-8859-4
和iso-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接收的所有数据转换回。