PostgreSQLsql檔案編碼引起的資料匯入亂碼或查詢字符集異常報錯(invalidbytesequence)
背景
當使用者客戶端字符集與服務端字符集不匹配時,寫入的多位元組字元(例如中文)可能出現亂碼。
例子
資料庫字符集為sql_ascii,允許儲存任意編碼字元。
digoal@pg11-320tb-zfs-> psql
psql (11beta4)
Type “help” for help.
postgres=# l+
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description |
---|---|---|---|---|---|---|---|---|
postgres | postgres | SQL_ASCII | C | en_US.utf8 | 140 TB | pg_default | default administrative connection database | |
template0 | postgres | SQL_ASCII | C | en_US.utf8 | =c/postgres + | 15 MB | pg_default | unmodifiable empty database |
postgres=CTc/postgres | ||||||||
template1 | postgres | SQL_ASCII | C | en_US.utf8 | =c/postgres + | 15 MB | pg_default | default template for new databases |
(3 rows)
客戶端為utf8編碼
digoal@pg11-320tb-zfs-> echo $LANG
en_US.utf8
編輯一個檔案,以UTF8編碼
vi test.sql
insert into tbl values (1, `你好`);
內容如下
digoal@pg11-320tb-zfs-> cat test.sql
insert into tbl values (1, `你好`);
編碼如下
digoal@pg11-320tb-zfs-> file test.sql
test.sql: UTF-8 Unicode text
轉換為GBK,寫入資料庫
digoal@pg11-320tb-zfs-> iconv –help
Usage: iconv [OPTION…] [FILE…]
Convert encoding of given files from one encoding to another.
Input/Output format specification:
-f, –from-code=NAME encoding of original text
-t, –to-code=NAME encoding for output
Information:
-l, –list list all known coded character sets
Output control:
-c omit invalid characters from output
-o, –output=FILE output file
-s, –silent suppress warnings
--verbose print progress information
-?, –help Give this help list
--usage Give a short usage message
-V, –version Print program version
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
For bug reporting instructions, please see:
http://www.gnu.org/software/libc/bugs.html.
digoal@pg11-320tb-zfs-> iconv -f UTF8 -t GBK test.sql|psql -f –
INSERT 0 1
或者這樣寫入(client_encoding和server都設定為sql_ascii時,不檢查編碼合法性,直接存入資料庫)
digoal@pg11-320tb-zfs-> iconv -f UTF8 -t GBK test.sql -o test.sql.gbk
digoal@pg11-320tb-zfs-> psql
psql (11beta4)
Type “help” for help.
postgres=# set client_encoding =sql_ascii;
SET
postgres=# i ./test.sql.gbk
INSERT 0 1
當設定客戶端client_encoding為utf8編碼時,由於存入的資料編碼不合法,導致查詢異常
digoal@pg11-320tb-zfs-> psql
psql (11beta4)
Type “help” for help.
postgres=# set client_encoding =utf8;
SET
postgres=# select * from tbl;
ERROR: invalid byte sequence for encoding “UTF8”: 0xc4 0xe3
當client_encoding設定為GBK編碼,查詢為亂碼
postgres=# set client_encoding =gbk;
SET
postgres=# select * from tbl;
id | info |
---|---|
1 | ?oí |
參考
《PostgreSQL 多位元組字符集合法性檢測》
《[轉] SqlServe到PG遷移錯誤:無效的編碼序列”UTF8″: 0x00》
《PostgreSQL UTF8 和 GB18030編碼map檔案不完整的問題》
《PostgreSQL WHY ERROR: invalid byte sequence for encoding “UTF8″》
《PostgreSQL SQL_ASCII encoding introduce》
《PostgreSQL Server Encoding sql_ascii attention》
轉自阿里雲德哥
相關文章
- 匯入sql檔案出現亂碼SQL
- office for Mac Excel匯入csv檔案亂碼MacExcel
- 資料檔案Resize引起的ORA-03297報錯
- 管理工具匯入CSV檔案,中文資料亂碼的解決辦法。
- 檔案格式引起的指令碼執行錯誤指令碼
- java程式碼實現excel檔案資料匯入JavaExcel
- Mysql資料庫使用Navicat Mysql匯入sql檔案報錯MySql資料庫
- Sqoop匯入資料異常處理OOP
- Sublime Text 查詢時排除指定的資料夾或檔案
- Linux下刪除亂碼或特殊字元檔案Linux字元
- 「Oracle」資料庫字符集編碼修改Oracle資料庫
- 檔案批次查詢複製匯出,按檔名批次查詢檔案,按檔案內容批次查詢檔案
- Linux查詢哪個程式佔用檔案或資料夾Linux
- MYSQL資料庫匯入資料時出現亂碼的解決辦法MySql資料庫
- 乾貨:blob匯出檔案亂碼解決方案
- c#匯出檔案,檔名中文亂碼解決方法C#
- 【Atom】autocomplete-python外掛報亂碼異常問題Python
- Drozer 查詢可被其他應用讀取 / 寫入的檔案時,報錯
- Loadrunner+引數化檔案編碼格式+獲取請求報文發生異常
- Idea編碼UTF-8中.properties 配置檔案中文亂碼Idea
- TOMCAT 請求資料編碼亂碼 問題Tomcat
- Spark原始碼編譯與匯入IDEA除錯Spark原始碼編譯Idea除錯
- hibernate異常之--count查詢異常
- 解決PHP匯出CSV檔案中文亂碼問題PHP
- springboot+mybatis,mapper呼叫查詢的資料為空,報空指標異常Spring BootMyBatisAPP指標
- MySQL案例-並行複製亂序提交引起的同步異常MySql並行
- mysql匯入sql檔案報錯 ERROR 2013 2006 2002MySqlError
- 檢測檔案編碼,轉換檔案編碼
- 小程式批次匯入excel資料,雲開發資料庫匯出cvs亂碼解決方案Excel資料庫
- 字符集編碼(二):字元編碼模型字元模型
- python查詢mysql中文亂碼問題PythonMySql
- hive表查詢中文顯示亂碼Hive
- MySQL直接匯出CSV檔案,並解決中文亂碼的問題MySql
- Oracle用資料泵匯入資料包12899的錯誤碼解決方法Oracle
- php讀取excel檔案資料的匯入和匯出PHPExcel
- 字符集與編碼
- [Docker核心之容器、資料庫檔案的匯入匯出、容器映象的匯入匯出]Docker資料庫
- Hive資料匯入HBase引起資料膨脹引發的思考Hive