虽然官方文档有提到编码的问题,但是对于中文讲的比较简单,给中文的PostgreSQL用户带来很多困扰,本文简单简述一下中文环境下PostgreSQL如何正确设置编码。
一、服务器端的编码设置
PostgreSQL在服务器端只支持两种简体中文编码:
EUC_CN和UTF-8,而由于windows不支持EUC所以,在windows环境底下只能选UTF-8。

  1. 安装时的编码设置
    1.1 Linux下的中文编码设置
    设置为EUC_CN

[localhost ~]$ initdb -E EUC_CN -D
data7 --locale=zh_CN
设置为UTF-8

[galy@localhost ~]$ initdb -E UTF-8 -D
data7 --locale=zh_CN.UTF-8
1.2 Windows下的中文编码设置
设置为UTF-8

initdb.exe -E UTF8
-D c:\data3 --locale=chinese
2. 常见的问题:
2.1 不支持的服务器编码

如果环境的默认编码是PostgreSQL不支持的话,初始化的时候会报错,如下面环境的中文编码为GBK,而PG不支持GBK,所以报错。

[localhost ~]$ export
LANG=zh_CN.gbk

[localhost ~]$ initdb -D testencoding
The database cluster will be initialized with locale
zh_CN.gbk.

initdb: locale zh_CN.gbk requires unsupported encoding GBK

Encoding GBK is not allowed as a server-side encoding.

Rerun initdb with a different locale selection.
2.2 locale和编码有冲突
如果指定的locale和编码格式有冲突,同样也会报错。解决的方便是,指定编码兼容的locale.
[localhost ~]$ locale

LANG=zh_CN.gbk

LC_CTYPE=“zh_CN.gbk”
默认的locale是中文gbk,
而下面的编码确实EUC_CN,因而系统报错,解决的方法是,指定–locale=zh_CN
[localhost ~]$ initdb -E EUC_CN -D data6

The files belonging to this database system will be owned by user
“galy”.

This user must also own the server process.
The database cluster will be initialized with locale
zh_CN.gbk.

initdb: encoding mismatch

The encoding you selected (EUC_CN) and the encoding that the

selected locale uses (GBK) do not match. This
would lead to

misbehavior in various character string processing functions.

Rerun initdb and either do not specify an encoding
explicitly,

or choose a matching combination.
initdb: 警告: 编码不匹配

您选择的编码 (EUC_CN) 和所选择的语言环境使用的编码 (GBK) 不匹配的.

这样将导致处理不同字符串的函数时产生错误.

要修复此问题, 重新运行 initdb 并且不要明确指定编码, 或者先选择一个匹配

组合类型.
二、客户端的编码

虽然PG支持客户端和服务器端的编码自动转换,但是还需要遵从一个原则:本地环境的编码和客户端编码需一致。否则将会出现乱码或者是其他问题。
本地环境的编码为GBK

C:\Program
Files\PostgreSQL\9.1\bin>chcp

活动代码页: 936
数据库的编码为UTF8

=#\t

Name
| lenovo

Owner
| lenovo

Encoding
| UTF8

Collate
| Chinese (Simplified)_People’s Republic of China.936

Ctype
| Chinese (Simplified)_People’s Republic of China.936

Access privileges |
客户端编码为GBK

lenovo=# \encoding

GBK
现在本地环境和客户端编码都是GBK,所以没有问题

客户端输入的GBK字符,会自动转化为UTF-8

lenovo=# insert into test
values(‘测试’);

INSERT 0 1
服务器端的UTF-8编码,传到客户端时候,也会自动转换编码为GBK:

lenovo=# select * from test;

name


测试

(1 row)
如果客户端设置为UTF-8的话,和本地环境的GBK不一致则会出现问题

lenovo=# \encoding UTF-8
由于客户端编码和服务器端一致,为UTF-8,所以不转换传到客户端,而操作系统把它当作GBK显示,所以显示乱码:

lenovo=# select * from test;

name


娴嬭瘯

(1 row)
而插入的字符则直接以GBK编码的形式传到服务器端,服务器端认识不了,所以报错。

lenovo=# insert into test
values(‘测试’);

ERROR: invalid byte sequence for encoding “UTF8”:
0xb2

ERROR: invalid byte sequence for encoding “UTF8”:
0xb2

输入和显示都有问题,这是因为如果客户端和服务器的编码都一致的话,则不进行转码,而输入是按照本地环境的GBK进行编码,GBK的编码进入UTF-8的库当然会有问题。
三、显示信息的中文话
PostgreSQL支持多语言显示提示信息,如果希望服务器端及客户端的提示信息为中文,还需要进行一些额外的设置。
首先, 编译的时候需要加上自然语言支持模块
./configure --enable-nls
其次,在参数配置文件postgresql.conf设置信息为中文
lc_messages =
‘zh_CN’

locale for system error message

这样在服务器端和客户端的提示信息都显示为中文
[localhost ~]$

日志: 已启动autovacuum

日志: 数据库系统准备接受连接

dsd;

错误: 语法错误 在 “dsd” 或附近的 第 1 个字符处

语句: dsd;

错误: 语法错误 在 “dsd” 或附近的

转载地址(http://blog.sina.com.cn/s/blog_976e49570100yxyu.html)

要想打开自动字符集转换功能,你必须告诉 PostgreSQL 你想在客户端使用的字符集(编码)。你可以用好几种方法实现这个目的。

用 psql 里的 /encoding 命令。 /encoding 允许你动态修改客户端编码。 比如,把编码改变为 SJIS,键入:

/encoding SJIS

使用 libpq 函数。 /encoding 在做此用途的时候实际上是调用 PQsetClientEncoding()。

int PQsetClientEncoding(PGconn *conn, const char *encoding);

这里 conn 与后端的联接,而 encoding 是你想用的编码。如果编码设置成功它返回 0,否则返回 -1。本次联接的当前编码可以用下面函数显示:

int PQclientEncoding(const PGconn *conn);

请注意它只返回编码 ID,而不是象 EUC_JP 这样的编码符号字串。 要把编码 ID 转换为编码符号,你可以用:

char *pg_encoding_to_char(int encoding_id);

使用 SET client_encoding TO。 可以用 SQL 命令设置客户端编码:

SET CLIENT_ENCODING TO ‘value’;

你还可以把 SQL 语法里的 SET NAMES用于这个目的:

SET NAMES ‘value’;

查询当前客户端编码:

SHOW client_encoding;

返回缺省编码:

RESET client_encoding;

使用 PGCLIENTENCODING。 如果在客户端的环境里定义了 PGCLIENTENCODING 环境变量, 那么在与服务器进行联接时将自动选择客户端编码。 (这个编码随后可以用上面谈到的任何其它方法覆盖。)

使用client_encoding配置变量。 如果在 postgresql.conf 里设置了 client_encoding 变量, 那么在与服务器建立了联接之后,这个客户端编码将自动选定。(这个设置随后可以被上面提到 的其他方法覆盖。)

假如无法进行特定的字符转换 — 比如, 你选的服务器编码是EUC_JP, 客户端是LATIN1,那62616964757a686964616fe58685e5aeb931333363376438么有些日文字符不能转换成LATIN1。这时, 不能用LATIN1字符集表示的字母将被转换成圆括弧包围的十六进制,像,(826C) 这样。

如果客户端字符集定义成了 SQL_ASCII,那么编码转换会被关闭, 不管服务器的字符集是什么都一样。和服务器一样,除非你的工作环境全部是 ASCII 数据, 否则使用 SQL_ASCII 是不明智的。

转载地址

postgresql客户端代码上传中文数据到服务器相关推荐

  1. app上传文本数据到服务器的实现

    一.目标 将app客户端用户填写的地点和描述信息上传到服务器. 二.流程 1.界面设计,两个TextView用来提醒用户该输入什么信息,两个EditText让用户输入文本信息,一个Button用来提交 ...

  2. Cell插件利用xml上传表格数据于服务器的B/S操作

    引言 随着XML技术发展,XML技术的广泛运用,用友华表cell插件在XML上的运用也取得很大发展,用友华表cell插件可以很方便的将客户端cell报表数据以XML形式发送给服务器,服务器再接受xml ...

  3. ESP8266上传DHT11数据给私人javaweb服务器实现网页查询数据的电路方案

    系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...

  4. java上传文件到远程服务器(一)---HttpURLConnection方式

    我们在之前的文章 JavaWeb静态资源分离思路 中已经了解到要把文件上传到静态资源服务器有三种方式: java上传文件到ftp服务器(这个方案需要在静态资源服务器安装ftp服务) java使用Htt ...

  5. 常用的xshell命令之从本地上传文件和从服务器下载文件到本地

    借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. 如果没有安装,需要执行:[cpp]yum install lrzsz[/cpp ...

  6. 关于HttpClient上传中文乱码的解决办法

    使用过HttpClient的人都知道可以通过addTextBody方法来添加要上传的文本信息,但是,如果要上传中文的话,或还有中文名称的文件会出现乱码的问题,解决办法其实很简单: 第一步:设置Mult ...

  7. Git入门最终集!SSH公钥是乱码怎么办?IDEA与Git!将自己的代码上传至远程仓库!

    Git入门最终集!SSH公钥是乱码怎么办?IDEA与Git!将自己的代码上传至远程仓库! 一.更改用户名和主机名! 因为当时Windows设置的用户名为中文名称,导致生成的SSH密钥是乱码非常难受,原 ...

  8. 七牛 savekey php,七牛云1:客户端直接上传文件

    最近因为项目要用到七牛云,所以花了点时间整理了一下学习心得. 使用七牛云,第一步当然就是上传文件了,常见的云存储上传文件流程一般有3种: 用户==>业务服务器(你自己的服务器)==>云存储 ...

  9. 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像

    2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...

  10. 分享三个例程:使用ESP32做一个实时语音对讲机,MQTT协议实现公网对讲,ESP32-CAM 上传图像数据到网络。并附上例程链接。

    分享三个例程:使用ESP32做一个实时语音对讲机,MQTT协议实现公网对讲,ESP32-CAM 上传图像数据到网络.并附上例程链接.可以比对着看来学习NOW,MQTT使用方法.想办法把图像和语音代码融 ...

最新文章

  1. 驼峰命名法模态对话框
  2. (0090)iOS开发之本地文件预览的三种方法(1)
  3. React Native 集成
  4. css颜色rgba代码对照表_改善 CSS 的 10 个最佳实践
  5. IT行业: 嵌入式工程师的进阶之路
  6. Scrapy实例1-爬取天气预报存储到Json
  7. Python二级基础知识点
  8. java 创建动态int数组_在Scala中创建动态增长数组的最佳方法是什么?
  9. centos bond配置文件示例
  10. python编程学习笔记_python学习笔记--python编程基础
  11. ML-Agents案例之看图配对
  12. 联想笔记本电脑键盘灯怎么开启_win10系统笔记本电脑开启/关闭键盘背光灯的方法...
  13. win10-用户忘记密码如何登录
  14. 备份蓝光光盘玩具总动员3,且Eclipse
  15. 数据结构算法---八大排序
  16. 初识c语言(入门篇)
  17. 一位游戏大厂测试的一些知识分享
  18. 小规模纳税人可以申请美元账户收款么?
  19. 基于FPGAd的FIR数字滤波器的设计和实现——刘朋全(西北工业大学)
  20. torch-scatter, torch-cluster, torch-sparse, torch版本对应,cuda

热门文章

  1. java cmd 乱码_java在cmd运行时出现乱码解决方法
  2. python微信商城_GitHub - pythonsir/nideshop: NideShop 开源微信小程序商城服务端(Node.js + ThinkJS)...
  3. 三菱FX系列PLC教程
  4. 南昌工程学院c语言试题,南昌工程学院概率论与数理统计试题库部分题目
  5. _beginthread
  6. VC编程中,判断野指针
  7. 单片机原理及接口技术第1章
  8. 新经济的50个新热点(转自:商务部网站)
  9. FPGA 38译码器
  10. bat计算机清理原理,电脑如何一键清除垃圾bat