我正在尝试从另一个PostgreSQL数据库中的另一堆表中的PostgreSQL数据库中的一堆表中导入一些数据。对于导入我使用PHP,因为我需要在将其插入新数据库之前进行一些数据操作。
一切都没问题,直到有一些文字包含单引号。我试图在插入数据之前逃避这些引号,我得到了这个错误:
错误:编码“UTF8”的字节序列无效:0x96提示:此 如果字节序列与编码不匹配,也会发生错误 由服务器预期,由“client_encoding”控制。
旧数据库上的编码是SQL_ASCII,而在新数据库上我有UTF8。
我该如何解决这个问题?
答案 0 :(得分:1)
您的旧数据库中可能有一些Windows-1252编码的文本(0x96在该编码中编码EN DASH)。
当服务器编码为SQL_ASCII
时,PostgreSQL不执行编码转换或验证;它只是存储和检索你给它的文本。如果您的旧数据库使用了UTF8
,那么您就不会遇到此问题。希望能做到。
你的所有文字都在WIN1252
中,这是一个很好的机会,但可能会有各种编码。最简单的方法是假设前者并在迁移脚本中将客户端编码设置为WIN1252
:
pg_set_client_encoding($new_database, 'WIN1252');
在与 new 数据库的连接上设置此项非常重要。它告诉Postgres,Windows 1252编码的文本正在进入,Postgres需要将其转换为UTF-8。
请注意,如果旧数据库中存在任何UTF-8编码的文本,则如果执行此操作,则会抛出错误或变为mojibake。
答案 1 :(得分:0)
在数据库中插入时使用pg_escape_string()