在Linux上安装SYBASE ASE 12.5/15.0数据库,为了跟客户的业务数据库保持一致,缺省字符集是iso_1,现在开发了一个B/S应用,运行在tomcat6.0上,默认使用utf8字符集,以前ASE和tomcat在Windows平台上时一切正常,网页和数据都能正常显示,当服务器全部移植到Linux (RHEL 5.3)上后,数据部分显示汉字就不正常了。连接数据的jdbc串一直是:
jdbc:sybase:Tds:192.168.1.5:5000/mydb?charset=cp936,如果把连接串改成jdbc:sybase:Tds:192.168.1.5:5000/mydb?charset=utf8,那么无论是Windows平台还是Lunix平台则都是乱码。
后来经研究发现,ASE数据库在将iso_1字符集转换为utf8字符集时,都是单字节转换的,换句话说他不认识汉字,在iso_1中的一个汉字到了utf8这里就变成了两个汉字了。如果将数据库的缺省字符集改成utf8,汉字部分增加50%的存储空间暂且不考虑,关键是要把所有数据重新bcp下是相当麻烦,若牵涉到客户的业务数据库,则风险更大。经过研究将缺省字符集由iso_1升级为gb18030则比较平顺,这里用了“升级”两字,简单的说gb18030是gbk/gb2312的升级版,当然更是iso_1的升级了。现在ASE数据库在将gb18030字符集转换为utf8字符集时能认得汉字了,既可以转换成utf8,也可以转换成cp936了。
只是在使用客户端工具时麻烦了些:
使用isql.exe和sqladv.exe连接的请增加参数:-Jgb18030,
使用PowerBuilder连接的请在Database Profile Setup -> Regional Settings -> Character Set: gb18030,
使用jdbc的请使用jdbc:sybase:Tds:192.168.1.5:5000/mydb?charset=utf8 或者 jdbc:sybase:Tds:192.168.1.5:5000/mydb?charset=cp936
那么如何将缺省字符集由iso_1升级为gb18030呢?
1、查看当前连接字符集:
select @@client_csname
go
2、安装字符集排序:
cd /sybase/charsets/gb18030
charset -Usa -Sserver_name binary.srt gb18030
3、查看gb18030字符集的id(返回的id一般是173,第4步要引用)
select name,id from master..syscharsets where name = 'gb18030'
go
4、改变服务器缺省字符集配置(173是上面第3步得到的)
sp_configure 'default character set id', 173
go
5、重启数据库,自动检查系统表的采用新字符集后的排序顺序,完了后自动关闭,需要再启数据库即可。
参考:http://www.chinaunix.net/jh/21/630973.html