- 论坛徽章:
- 0
|
注意: 把附件 pg80d_dif.zip.jpg 改名为 pg80d_dif.zip,解压即可.
Subject: 如何解决中文环境下 PostgreSQL 8.0 dev 的 token 和 timezone 问题
Author : Wwashington@smth bbs
Release: 2004/08/09
前言:PostgreSQL 是最强大的开放源码数据库,目前的 7.5 dev 突然变成 8.0 dev 了。既然是 dev 版肯定存在不少问题,导致使用不便甚至无法安装。我这篇文档是针对 2004/08/08 的 postgresql-snapshot.tar.gz 制作的,其他版本请大家自行研究。
关于 dev 版下载,http://mirrors.isc.org/pub/postgresql/dev/postgresql-snapshot.tar.gz
Part A. 故障描述
1) FATAL: syntax error in file "E:/Unix/Sys/Pgsql/data/postgresql.conf"
line 261, near token "s"
2) WARNING: could not find a match for Windows timezone "中国标准时间"
Part B. 故障分析
1) initdb -U postgres -D "E:/Unix/Sys/Pgsql/data" -L "E:/Unix/Sys/Pgsql/share" --noclean
使用这个脚本初始化,发现 near token "s" 错误,不删除错误配置,发现问题在 Chinese_People's
2) initdb -U postgres -D "E:/Unix/Sys/Pgsql/data" -L "E:/Unix/Sys/Pgsql/share" --locale=C
对于第一个问题,可以用上面的办法初始化,但是又出现了第二个问题,也就是 timezone 无法匹配
Part C. 故障解决
1) 经研究,token 问题是因为 src/bin/initdb/initdb.c 里面缺少了语法分析,由于时间关系,我只做了针对中文的快速补丁。真正支持多语言的补丁,应该是预先扫描 lc_messages、lc_monetary、lc_numeric、lc_time 的 string 里是否含有单引号(即'号),如果有则在前面增加反斜杠(即\号),可以用 &str 的形式取得指针然后进行字符串处理。
/* 如果检测到 's 就修改为 \'s,因为 Unix 的 Sed 语法需要反斜线 \ 作为定义符 */
if (strcmp(lc_messages,"Chinese_People\'s Republic of China.936"==0 )
{
sprintf(lc_messages,"%s","Chinese_People\\\'s Republic of China.936"
}
if (strcmp(lc_monetary,"Chinese_People\'s Republic of China.936"==0 )
{
sprintf(lc_monetary,"%s","Chinese_People\\\'s Republic of China.936"
}
if (strcmp(lc_numeric,"Chinese_People\'s Republic of China.936"==0 )
{
sprintf(lc_numeric,"%s","Chinese_People\\\'s Republic of China.936"
}
if (strcmp(lc_time,"Chinese_People\'s Republic of China.936"==0 )
{
sprintf(lc_time,"%s","Chinese_People\\\'s Republic of China.936"
}
snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages);
conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);
......
2) 经研究,timezone 问题是因为 src/timezone/pgtz.c 按英文处理 locale,但是系统显示的是中文信息,所以必须增加一个本地语言的扫描,把所有的 locale 做一个合适的对应。由于时间关系,我没有写完整的函数,只对中文做了快速补丁。
if (strcmp(tzname, "中国标准时间"==0 )
{
sprintf(tzname, "%s", "China Standard Time"
}
for (i=0; win32_tzmap.stdname != NULL; i++)
{ ......
} |
|