【问题标题】:PostgreSql foreign table select fails due to special characters rows由于特殊字符行,PostgreSql 外部表选择失败
【发布时间】:2021-11-25 20:58:48
【问题描述】:

我刚刚设置了一个新的外部表,如果我只选择“ID”(整数)字段,它就会按预期工作。

当我添加“描述”(文本)字段并尝试选择表格时,它会失败并显示以下错误消息:

utf-8 'Codec cannot decode byte 0xfc in position 10: invalid start byte

查看远程表后,发现“Description”包含特殊字符,如:“ö, ü, ä”

我能做些什么来解决这个问题?


表定义(仅前 2 行)

远程表:

CREATE TABLE test (
    [Id] [char](8) NOT NULL,
    [Description] [nvarchar](50) NOT NULL
)

外表:

Create Foreign Table "Test" (
    "Id" Char(8),
    "Description" VarChar(50)
) Server "Remote" Options (
    schema_name 'dbo', table_name 'test'
);

附加信息:

  • 外来数据包装器:tds_fdw
  • 本地服务器:Postgres 12,编码:UTF8
  • 远程服务器:Sql Server,编码:Latin1_General_CI_AS

【问题讨论】:

  • 请告诉我们 a) 您正在使用哪个外部数据包装器(听起来不像 postgres_fdw) b) 两个数据库上的服务器编码是什么 c) 外部服务器和外部表是如何定义的.
  • @LaurenzAlbe 感谢您的回复,请查看编辑。
  • 它告诉你的是第 10 个字符是一个无效的 UTF-8 字符。可能是由于从 Latin-1 错误地转换为 UTF-8 所致。 0xfc 在拉丁语 1 中是 ü。为简单起见,您可以将该列设置为 Latin-1。或整个表或架构(视情况而定)。
  • 您是否尝试在freetds.conf 中设置“client charset = UTF-8”?

标签: postgresql foreign-data-wrapper


【解决方案1】:

按照 cmets 中的 Laurenz Albe 建议,我在我的 PostgreSQL 文件夹中创建了一个 freetds.conf,其内容如下:

[global]
tds version = auto
client charset = UTF-8

不要忘记在环境变量FREETDS中设置配置文件的路径。

Powershell:

[System.Environment]::SetEnvironmentVariable('FREETDS','C:\Program Files\PostgreSQL\12',[System.EnvironmentVariableTarget]::Machine)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多