Postgresql
從 PostgreSQL 數據庫中刪除導致編碼錯誤的字元
我有一個使用 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 ,沒有對應於該十六進制程式碼的字元
9D
。81
,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 客戶端編碼。