Postgresql

從 PostgreSQL 數據庫中刪除導致編碼錯誤的字元

  • January 8, 2018

我有一個使用 WIN1252 編碼的 PostgreSQL 10 數據庫。

從 pgAdmin 4 執行選擇時,我的其中一列的值會導致轉換錯誤:

SELECT myfield FROM mydb.myschema."MYTABLE"

回報:

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

在 pgAdmin 4 中將客戶端編碼設置為 WIN1252 會導致它斷開與數據庫的連接(我記得在某處讀到 pgAdmin 4 在設置客戶端編碼時存在問題,但請跟踪連結)。

使用 psql 並將客戶端編碼設置為 WIN1252,選擇有問題的功能之一:

SELECT myfield
FROM mydb.myschema."MYTABLE"
WHERE oid = 12345

回報:

“A sample comment

查看最初導入數據庫的數據,“彎引號”似乎被錯誤地導入。

有沒有辦法從列中刪除這些字元 - 用正常引號替換它們,或者乾脆刪除它們?

查看 WIN1252 字元集: https ://en.wikipedia.org/wiki/Windows-1252 ,沒有對應於該十六進制程式碼的字元9D81, 8D, 8F,也是如此90

這就是為什麼它在 UTF8 中“不等效”的原因:該字元在源映射中首先不存在。

WIN1252在以編碼配置的會話中顯示或輸入時,它不會出錯。當在 cmd.exe 上使用帶有 psql.exe 的正確程式碼頁 ( chcp 1252) 時,這些字元在我的環境中顯示為矩形框內的問號。

無論如何,您可能希望使用以下語句刪除這些(使用 WIN1252 客戶端編碼時):

UPDATE tablename SET field=replace(field, chr(x'9D'::int), '')
 WHERE strpos(field,chr(x'9D'::int))>0;

如果 WIN1252 無法與 PgAdmin 一起使用,請使用 psql。刪除這些字元後,您可以稍後切換到 UTF8 客戶端編碼。

引用自:https://dba.stackexchange.com/questions/194857