数据库编程的编码问
数据库编程设计的编码问题包括三个方面:
    数据库服务器编码;
    数据库客户端编码;
    本地环境编码。
(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客户端编码问题相关推荐

  1. mysql修改客户端编码命令_mysql命令行修改字符编码

    1.修改数据库字符编码 mysql> alter database mydb character set utf8 ; 2.创建数据库时,指定数据库的字符编码 mysql> create ...

  2. linux mysql 客户端编码设置_mac和linux下mysql字符集设置问题

    为什么要设置字符集 设置字符集主要是解决乱码问题,由于中文和英文编码不同导致,中文出现乱码,所以一般都设置为utf8格式 不同的字符集占用的字节大小不同,选择合适的字符集可以提高数据库的性能, mac ...

  3. linux mysql 客户端编码设置_Windows、Linux系统下mysql编码设置方法_MySQL

    bitsCN.com 方法1 怎样手工修改mysql4.1以上版本默认编码 使用php5+MySQL 4.1.x/5.x 环境: mysql4导入mysql5容易出现中文乱码情况,因此,首先你需要做如 ...

  4. 26_C# 实现VMS客户端——编码_多线程

    声明: 本博客为原创博客,主要讲述使用C#语言调用服务端SDK方式完成VMS客户端完整功能实现,转载请声明出处. 如有技术问题或需交流可直接联系本人邮箱:chuiwenwei@163.com 简述: ...

  5. 【docker】dbclient远程访问非本机数据库(mysql,oracle,postgres,sqlserver/mssql),测试远程数据库连通性

    一.docker_dbclient远程连接mysql 1.将拉下来的mysql镜像跑起来 docker run -idt docker_dbclient:1.0 /bin/bash 2.进入mysql ...

  6. 【postgres】超详细介绍

    文章目录 部署 设置用户 备份恢复 pg_dump.pg_restore copy to.copy from pg_settings 流复制 分区表 pg_resetwal pg_archivecle ...

  7. oracle pg 文件级迁移,Ora2pg 把oracle数据导入到postgres

    1 Ora2pg特性 1.导出整个数据库模式(表.视图.序列.索引),以及唯一性,主键.外键和检查约束. 2.导出用户和组的授权/权限. 3.导出筛选的表(通过制定表明). 4.导出Oracle模式到 ...

  8. 金仓数据库KingbaseES数据库参考手册(服务器配置参数12. 客户端联接默认)

    12.1. 语句动作 ¶ client_min_messages 属性 描述 类型 enum 默认值 NOTICE 级别 USER---用户级 控制被发送给客户端的 消息严重级别 .有效值是 DEBU ...

  9. PostgreSQL编码格式:客户端服务器、客户端、服务器端相关影响

    关于字符编码这块,官网链接: https://www.postgresql.org/docs/current/charset.html 刚刚写了几百字的东西因为断网,导致全没有了,重头再写,我就只想记 ...

最新文章

  1. jquery二维码生成插件jquery.qrcode.js
  2. 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账号添加 | 源码资源 )
  3. abaqus切削为什么没有切屑_SiCp/Al复合材料超声振动辅助切削研究现状与进展
  4. windows时间设置
  5. 单片机c语言程序源代码,51单片机C语言程序设计源代码
  6. 【Electron+Vue】【一】开发跨平台桌面应用了解+构建
  7. html 显示动态时间
  8. UE4 Spline
  9. Codeforces 1089K King Kog's Reception(线段树)
  10. 小鸡饲料任务,蚂蚁庄园养鸡线下扫码付款收饲料地址,蚂蚁庄园养鸡线下扫码付款0.01元收饲料地址...
  11. 最好的 QML 教程,让你的代码飞起来!
  12. Hadoop性能调优全面总结
  13. Java中的排序——高级用法
  14. ACM Plan UVa - 168 Theseus and the Minotaur(图的遍历,深度优先)
  15. Linux 动态库的编译和使用
  16. 你自己写春联吗?你会贴春联吗?还是毛笔墨水早就不见了?
  17. 华为p20pro关闭HTML查看,华为p20如何调出息屏时钟 每天定时开启灭屏显示功能
  18. android 启动其他app的activity,Android在一个app中启动其他app中的service或者Activity
  19. linux centos安装远程软件向日葵
  20. 基于ant-design-vue的简易农历日历

热门文章

  1. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复
  2. SDUTOJ2828_字典树
  3. 使用spring initialization创建SpringBoot项目
  4. 140.String Compression
  5. 搞懂 SynchronizationContext
  6. V9任何页面GET调用内容分页的说明
  7. mysql 数学函数
  8. HDU 2574 HDOJ 2574 Hdu Girls' Day ACM 2574 IN HDU
  9. [经典推荐]事半功倍系列之javascript
  10. MFC-Tab Control控件使用