PostgreSQL sql文件编码引起的数据导入乱码或查询字符集异常报错(invalid byte sequence)

本文涉及的产品
PolarSearch,搜索节点 4核8GB
PolarDB Agent Express,2核4GB
云数据库 PolarDB MySQL 版,列存表分析加速 8核16GB
简介: postgresql 数据库 文件编码

背景
当用户客户端字符集与服务端字符集不匹配时,写入的多字节字符(例如中文)可能出现乱码。

例子
数据库字符集为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》
转自阿里云德哥

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
12月前
|
SQL 存储 关系型数据库
PostgreSQL窗口函数避坑指南:如何让复杂分析查询提速300%?
本文基于真实企业级案例,深入剖析PostgreSQL窗口函数的执行原理与性能陷阱,提供8大优化策略。通过定制索引、分区裁剪、内存调优及并行处理等手段,将分钟级查询压缩至秒级响应。结合CTE分阶段计算与物化视图技术,解决海量数据分析中的瓶颈问题。某金融客户实践表明,风险分析查询从47秒降至0.8秒,效率提升5800%。文章附带代码均在PostgreSQL 15中验证,助您高效优化SQL性能。
577 0
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
11月前
|
SQL
SQL中搜索中文无效或Select中文变乱码
SQL中搜索中文无效或Select中文变乱码
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
616 2
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
1866 1
|
SQL 关系型数据库 MySQL
PolarDB产品使用问题之如何将指定的备份SQL文件导入到集群中
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
200 0
|
SQL 关系型数据库 MySQL
MySQL 导出 表结构,执行 .sql 文件导入结构或者数据
MySQL 导出 表结构,执行 .sql 文件导入结构或者数据
|
SQL 关系型数据库 MySQL
Linux系统如何将sql文件导入mysql
在学习阿里云搭建网址时发现sql_file="/var/www/html/static/backup/sql/"$(ls /var/www/html/static/backup/sql/) &&mysql -uroot -pNewPassWord1. pbootcms < $sql_file语句报错。在打开公网的网址时发现数据库查询语言报错,不存在表,于是第一时间排除是在Linux系统中/var/www/html/static/backup/sql/的文件没有成功导入到MySQL中。
690 0
Linux系统如何将sql文件导入mysql

推荐镜像

更多