gpt4 book ai didi

php - 使用 psql 插入 postgres 数据库时的特殊字符

转载 作者:行者123 更新时间:2023-11-29 12:07:09 25 4
gpt4 key购买 nike

我尝试使用 psql 将特殊字符“†”添加到 varchar 字段,但没有成功。从 php 应用程序它可以工作(php 用户为 iso8859-1)。

db 的设置是:

encoding = LATIN1
collation = fi_FI
character type = fi_FI
client both UTF8 & LATIN1 (on commandline PGCLIENTENCODING=LATIN1 or PGCLIENTENCODING=UTF8)

从表中选择当客户端是 UTF8 时显示

locationx \u0086

如何将psql的值添加到数据库中?以下均无效。

update tablex set field1 = 'locationY' || '†'
update tablex set field1 = 'locationY' || U&'\86'

给出错误信息。

ERROR:  character with byte sequence 0xe2 0x80 0xa0 in encoding "UTF8" has no equivalent in encoding "LATIN1"
ERROR: invalid Unicode escape value at or near "\86' "

如果我查看我的 PHP 应用程序输入的数据,字节是 \x6c6f636174696f6e5986,但是当我使用 psql 输入数据时,字节是 \x6c6f636174696f6e59e280a0

最佳答案

它不适用于 PHP 或 psql,因为字符 在 LATIN-1 编码中不存在。你只是不能将它存储在数据库中。

让我解释一下这是怎么回事。

  • 如果您的客户端编码是 LATIN1 并且您在 psql 中输入:

    INSERT INTO ... VALUES ('locationY†');

    存储成功,因为你的终端设置为UTF-8。所以你输入的实际上是三个字节:\xE280A0,它们被解释并存储为三个单字节字符。

  • 如果您的客户端编码是 UTF8 并且您在 psql 中输入:

    同样的insert会报错,因为当你输入时输入的三个字节会被正确解释为 Dagger 字符,而PostgreSQL尝试转换时会报错LATIN 的字符:

    ERROR:  character with byte sequence 0xe2 0x80 0xa0 in encoding "UTF8" has no equivalent in encoding "LATIN1"
  • 使用 PHP,您的客户端编码可能设置为 LATIN1,而 PHP 程序实际上使用 WINDOWS-1252 编码。

    那么用单字节\x86表示。这是由 PostgreSQL 在 LATIN1 编码中解释的,它意味着完全不同的东西,即“选定区域的开始”控制字符 U+0086

    现在,当您的 PHP 程序读回该字符时,一切似乎工作正常,但数据库实际上存储了一个与您预期不同的字符。

    您会注意到,一旦您尝试通过任何其他方式选择值,例如在您的 psql 控制台上。那里的值(value)将呈现为

    locationY\u0086

这里是一个解决方案,如何让事情正常进行:

  • 使用 UTF8 编码创建一个新数据库。

  • 转储旧数据库

    pg_dump -F p -E LATIN1 dbname
  • 手动编辑转储并更改行

    SET client_encoding = 'LATIN1';

    SET client_encoding = 'WIN1252';
  • 使用 psql 将转储加载到新数据库中。

  • 将您的 PHP 应用程序的 client_encoding 更改为 WIN1252 并开始使用新数据库。

关于php - 使用 psql 插入 postgres 数据库时的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57766286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com