如何在NpgsqlConnection中设置编码?

本文关键字:设置 编码 NpgsqlConnection | 更新日期: 2023-09-27 18:11:46

我有一个PostgreSQL数据库,它使用字符编码WIN1252

当查询数据库时,一些记录在试图读取数据时会产生错误,因为它试图将其转换为UTF8。这种情况发生在一些包含某些非拉丁字符的外国名称上。

错误是:

ERROR: 22P05: character with byte sequence 0x81 in encoding "WIN1252" has no equivalent in encoding "UTF8"

当我在NpgsqlDataReader上调用Read()时发生。

我的连接定义为:

new NpgsqlConnection("Server=127.0.0.1;Port=5432;Database=xyz;User Id=****;Password=****;");

我能做些什么来读取这些数据使用c# ?

如何在NpgsqlConnection中设置编码?

我已经设法解决了这个问题。没有办法在连接字符串或NpgsqlConnectionNpgsqlCommand的任何属性中设置属性。

但是,我能够在查询中设置client_encoding的值。因此,直接在打开连接后,我首先执行了(非)查询:

set client_encoding = 'WIN1252'

之后,同一连接上的任何后续命令都使用正确的编码并返回结果。

我试图改变连接字符串,但我没有运气。通过更改数据库设置文件并重新加载,问题得到了解决。

所以我启动了pgadmin并执行

SHOW config_file;

给了我

 C:/Program Files/PostgreSQL/14/data/postgresql.conf
我把lang_language中的lc_messages改成了。1252到UTF8。之后,我在pg admin中重新加载了这个配置,右键单击服务器名称并按"Reload configuration"。

所有设置现在都设置为UTF8,它工作得很好。

lc_messages = 'UTF8'            # locale for system error message
                    # strings
lc_monetary = 'UTF8'            # locale for monetary formatting
lc_numeric = 'UTF8'         # locale for number formatting
lc_time = 'UTF8'                # locale for time formatting
...