-
-bash-4.1$ locale
-
LANG=en_US.UTF-8
-
LC_CTYPE="zh_CN.utf8"
-
LC_NUMERIC="zh_CN.utf8"
-
LC_TIME="zh_CN.utf8"
-
LC_COLLATE="zh_CN.utf8"
-
LC_MONETARY="zh_CN.utf8"
-
LC_MESSAGES="zh_CN.utf8"
-
LC_PAPER="zh_CN.utf8"
-
LC_NAME="zh_CN.utf8"
-
LC_ADDRESS="zh_CN.utf8"
-
LC_TELEPHONE="zh_CN.utf8"
-
LC_MEASUREMENT="zh_CN.utf8"
-
LC_IDENTIFICATION="zh_CN.utf8"
-
LC_ALL=zh_CN.utf8
-
-
-bash-4.1$ psql
-
psql (9.3.4)
-
输入 "help" 来获取帮助信息.
-
-
postgres=# ss5;
-
错误: 语法错误 在 "ss5" 或附近的
-
第1行ss5;
-
^
日志中的消息也是UTF8。而且即使像这样修改客户端的编码为gb2312。
-
-bash-4.1$ export LC_ALL=zh_CN.gb2312
-
-bash-4.1$ psql
-
psql (9.3.4)
-
?? "help" 4?衰?х?.
-
-
postgres=# ss6;
-
??: ?·¨?? ? "ss6" ?载
-
???ss6;
-
^
服务端日志中消息还是UTF8。(前面3条消息是postmaster进程报的消息,为gb2312编码)
-
< 2014-09-19 21:09:25.884 CST >??: ?????ι??±?厪 2014-09-19 21:09:24 CST
-
< 2014-09-19 21:09:25.890 CST >??: ??????±??????
-
< 2014-09-19 21:09:25.891 CST >??: ????autovacuum
-
< 2014-09-19 21:14:34.095 CST >错误: 语法错误 在 "ss5" 或附近的 第 1 个字符处
-
< 2014-09-19 21:14:34.095 CST >语句: ss5;
-
< 2014-09-19 21:26:52.511 CST >错误: 语法错误 在 "ss6" 或附近的 第 1 个字符处
-
< 2014-09-19 21:26:52.511 CST >语句: ss6
创建一个gb2312编码的数据库,连上去。错误消息就是gb2312了。
-
-bash-4.1$ export LC_ALL=zh_CN.utf8
-
-bash-4.1$ createdb -T template0 -E EUC_CN --locale=C euccn
-
-bash-4.1$ psql euccn
-
psql (9.3.4)
-
输入 "help" 来获取帮助信息.
-
-
euccn=# ss7;
-
错误: 语法错误 在 "ss7" 或附近的
-
第1行ss7;
-
^
日志中的消息也是gb2312。
-
< 2014-09-19 21:38:42.203 CST >语句: CREATE DATABASE euccn ENCODING ‘EUC_CN‘ LC_COLLATE ‘C‘ LC_CTYPE ‘C‘;
-
-
< 2014-09-19 21:40:31.478 CST >??: ?·¨?? ? "ss7" ?载? 1 ?薷
-
< 2014-09-19 21:40:31.478 CST >??? ss7
3. 结论
输出本地语言消息时服务端日志文件中可能会混合不同编码的消息。为了避免这种事发生,需要注意以下两点
1)同一数据库集群(cluster)中的多个数据库使用同一种编码
2)启动数据库时的环境locale(LC_CTYPE)也使用相同的编码