Postgres客户端编码问题
数据库编程的编码问题
数据库编程设计的编码问题包括三个方面:
数据库服务器编码;
数据库客户端编码;
本地环境编码。
(1)数据库服务器字符编码:
数据库服务器支持某种编码,是指数据库服务器能够从客户端接收、存储以及向客户端提供该种编码的字符,并能将该种编码的字符转换到其它编码。
查看PostgreSQL数据库服务器端编码:
postgres=# show server_encoding;
server_encoding
-----------------
UTF8
postgres=# \l
名称 | 拥有者 | 字元编码 | Collate | Ctype | TestDb1 | TestRole1 | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
TestDb2 | postgres | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
postgres | postgres | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
template0 | postgres | UTF8 | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 |
(2)数据库客户端字符编码:
客户端工具支持某种编码,必须能够显示从数据库读取的该种编码的字符,也能通过本工具将该种编码的字符提交到给服务器端。
查看PostgreSQL客户端工具psql编码:
postgres=# show client_encoding;
GBK
postgres=# \encoding
GBK
指定Postgresql会话的客户端编码:
postgres=# set client_encoding to 'utf8';
SET
postgres=# show client_encoding;
client_encoding
-----------------
UTF8
(3)本地环境编码:
如果使用dos的命令行界面,本地环境就是指dos命令行环境的编码,可以使用dos命令chcp查看dos环境编码:
D:\Program Files\PowerCmd>chcp
活动代码页: 936
----936为简体中文,GBK;
如果在使用某种编辑器,则本地环境编码取该编辑器的编码设置。
四、实例
虽然PG支持客户端和服务器端的编码自动转换,但是还需要遵从一个原则:本地环境的编码和客户端编码需一致。
1、PostgreSQL的数据库postgres,服务器端字符编码为utf8,客户端工具psql字符编码为GBK,本地环境dos命令编辑器编码为GBK,此时:
postgres=# show server_encoding;
server_encoding
-----------------
UTF8
(1 行记录)
postgres=# show client_encoding;
client_encoding
-----------------
GBK
(1 行记录)
postgres=# \! chcp
活动代码页: 936
postgres=# select * from "TestTb1";
Column1
-----------
测试
11
由于本地环境和客户端编码都是GBK,一致,没有问题;
insert时,客户端接收本地环境输入的GBK字符(两者都为GBK),客户端传到服务器端时自动转换为UTF-8编码存储,没有问题;
select时,服务器端传到客户端,UTF-8编码自动转换为GBK编码,在本地环境显示时,本地环境就是GBK编码,显示没有问题。
2、PostgreSQL的数据库postgres,服务器端字符编码为utf8,客户端工具psql字符编码为utf8,本地环境dos命令编辑器编码为GBK,此时:
postgres=# set client_encoding to 'utf8';
SET
postgres=# insert into test values('测试1');
閿欒?: 鏃犳晥鐨?"UTF8" 缂栫爜瀛楄妭椤哄簭: 0xb2
postgres=# select * from test;
column1
--------------------
娴嬭瘯
(1 行记录)
由于客户端和服务器的编码一致,故不进行转码,
insert时,本地输入的GBK编码到客户端不自动转换,客户端把接收的字符作为utf编码传给服务器端不转换,GBK的编码作为UTF-8存储,故有问题。
报错的信息为:ERROR: invalid byte sequence for encoding "UTF8": 0xb2;
select时,服务端的utf编码传给客户端不转换,客户端把utf编码传给本地环境不自动转换,utf8编码用gbk编码显示,故有问题。
3、本地环境就是指此时使用的环境,起初我使用powercmd代替windows的cmd命令行工具,实现上面第1个实例是总是失败(乱码)。
原因就是,此时本地环境编码是指powercmd的编码,而不是执行chcp命令得到的编码。
而powercmd使用的编码究竟是什么,我也没有找到。
总结:①直接在psql执行insert或者select的时候,设置client_encoding=gbk(默认),不乱码;(上面例子证明了)
②使用“\i sql文件.sql”(sql文件是utf8编码)命令的时候,如果sql文件中有中文,一定要先行执行set client_encoding=utf8;(设置此之后,按照上面说的,客户端不转换,直接把接收的字符作为utf8编码传给服务器端,而文件本身就是utf8,所以不乱码;同理如果sql文件是ansi编码即gbk编码的话,确保client_encoding为gbk;总之,sql文件与client_encoding编码一致),才不乱码。
Postgres客户端编码问题的更多相关文章
- Oracle插入中文数据乱码 设置服务器编码和客户端编码一致
- postgres函数
1.数据修复最先考虑通过db内做修复,实在不行,在考虑外部应用程序通过jdbc修复. 比如一个场景:profile_image_url与enlarge_image_url都是微博用户信息返回的字段. ...
- postgres 基本使用
postgres=# help 您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面 键入: \copyright 显示发行条款 \h 显示 SQL 命令的说明 \? 显示 pgsq ...
- PostgreSQL编码格式:客户端服务器、客户端、服务器端相关影响
关于字符编码这块,官网链接: https://www.postgresql.org/docs/current/charset.html 刚刚写了几百字的东西因为断网,导致全没有了,重头再写,我就只想记 ...
- Linux下设置Mysql数据库编码
重装系统后,要装个mysql服务器,发现添加数据时,一直错误,查其原因,原来时编码问题.Google了一下,可都不太一样,可能时数据库版本问题吧. 查看数据库版本: select version(); ...
- 帆软报表FineReport数据库连接编码转换
1. 问题描述 数据库会以某种编码方式保存与读取数据,FineReport解析时默认使用GBK字符集,若数据库端编码与设计器端编码不一致时,就会导致中文及特殊字符的乱码. FineReport在定义数 ...
- mysql编码设置
一:mysql字符集 mysql的字符集支持(Character Set Support)有两个类型:字符集(Character set)和连接校对(Collation).对于字符集的支持细化到四个层 ...
- mysql之字符编码问题
mysql编码分为服务端编码和客户端编码两大类字段编码, 表编码, 数据库编码这些编码都属于服务端编码,服务端编码决定你可以存哪些字符以及这些字符要哪种规则排序.字段编码优先级最高. 你插入用什么码属 ...
- Mysql编码, Mysql编码流程, Mysql编码顺序, Mysql编码原理, Mysql编码修改依据
编码查看方式以及解释说明: 需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root –p,之后两次输入root用户的密码),查看数据库的 ...
随机推荐
- webdriver实用指南python版本(1)-安装开发环境
webdriver实用指南是本人编写的系列丛书,包括ruby版.python版和java版.在线版是免费的,之前是放在我的github上,但是很多同学总不记得地址,现在转到我的博客上,方便大家阅读. ...
- SharePoint CAML In Action——Part I
在SharePoint中,我们经常要对List进行操作,比如要从List中取出相应的ListItem,利用CAML是个好办法.在没了解CAML之前,我是这样取数据的: MyList.Items.Cas ...
- Android Studio中如何设置颜色拾色器工具
Android Studio如何设置颜色拾色器工具Color Picker? 你可能下载过一些获取颜色值的一些小工具, 这种方式获取颜色,需要先切换窗口转跳到桌面,然后打开拾色器小工具程序,然后去拾取 ...
- jeecg中datagrid中获取选定行的字段值
datagrid代码如下: <t:datagrid name="orderMainList" checkbox="true" pagination=&qu ...
- MongoDB ReplacaSet & Sharding集群安装 配置 和 非集群情况的安装 配置 -摘自网络
单台机器做sharding --单机配置集群服务(Sharding) --shard1_1 mongod --install --serviceName MongoDBServerShard1 --s ...
- ios总结2018
1.为什么说Objective-C是一门动态的语言? 1.object-c类的类型和数据变量的类型都是在运行是确定的,而不是在编译时确定.例如:多态特性,我们可以使用父类指针来指向子类对象,并且可 ...
- Shader中ColorMask的使用
ColorMask可以对输出颜色进行Mask处理 使用方法和Cull这些标记差不多 SubShader { ColorMask R Cull Off .... 如果ColorMask填0就什么都不显示
- 【Unity】8.1 Unity内置的UI控件
分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 Unity 5.x内置了-套完整的GUI系统,提供了从布局.控件到皮肤的-整套GUI解决方案,因此可直接利用它做出各种风 ...
- 【Unity】4.7 摄像机
分类:Unity.C#.VS2015 创建日期:2016-04-11 一.简介 摄像机(Camera)是为玩家捕捉并展示世界的一种设备.场景中至少需要有一台摄像机,也可以在一个场景中使用多台摄像机.这 ...
- 行为类模式(二):命令(Command)
定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. UML 优点 能比较容易的设计一个命令队列 可以较容易的将命令加入日志 ...