postgres 使用 libpq 从 STDIN 进行复制,并出现 UTF8 编码错误

问题描述 投票:0回答:1

我通过以下命令创建了数据库:

CREATE DATABASE myendb
ENCODING 'UTF-8' 
LC_COLLATE 'en_US.UTF-8'
LC_CTYPE 'en_US.UTF-8'
TEMPLATE template0;

我尝试通过调用 PQputCopy..() 函数按照复制命令将 UTF8 编码的西里尔字母插入表中,但出现以下错误:

COPY  my_table_name(columns list)
FROM STDIN WITH  CSV DELIMITER AS ';' NULL AS  E'' QUOTE '"' failed.


EOF:0 Message:ERROR:  value too long for type character(15)
                                            

我尝试将“ENCODING UTF8”添加到cmd中,我收到另一个错误:

 COPY   my_table_name(columns list) 
 FROM STDIN WITH  CSV DELIMITER AS ';' NULL AS  E'' QUOTE '"'  ENCODING 'UTF8' failed.


EOF:0 Message:ERROR:  character with byte sequence 0xd0 0xbb in encoding "UTF8" has no equivalent in encoding "WIN1252"

我通过UTF8加载西里尔文句子编码。该数据库也是使用 UTF8 编码创建的。字符集也设置为UTF8。我使用 libpq 来连接并执行复制命令。哪里没有WIN1252... 我还尝试添加 'set client_encoding='utf8'' - 它没有帮助。 我不知道如何解决这个问题... 谢谢您的帮助!

utf-8 pg libpq
1个回答
0
投票

我在一台服务器上有多个数据库。我使用 PQconnectdb() 连接一些适当的数据库,例如 myendb,但 libpq 连接到默认数据库,例如 postgres。该 postgres 数据库的编码与 myendb 不同。因此我得到了上限错误。

当我尝试使用 PQsetdbLogin() 函数连接到 myendb 数据库后,libpq 连接到 myendb 数据库并成功执行复制命令。

PQconnectdb 和 PQsetdbLogin 有区别。虽然对于 PQconnectd() 函数我设置了 dbname=myendb,但 libpq 连接到 postgres。这很奇怪...我的postgresql版本是12.17.

© www.soinside.com 2019 - 2024. All rights reserved.