讨论一下ASE的字符集
现在ase的缺省字符集是eucgb,也就是gb2312,但我发现如果不用univarchar或unichar或者其他unicode的客户程序例如java,client程序也都能正确识别汉字出来。例如:"赟"这个字就不在gb2312里,而是存在于gbk(cp936)里,可是如果create table tb(str varchar(10)),然后insert tb values("赟")
然后怎么查也没有错嘛。那么把数据库的字符集升级到cp936甚至gb18030还有什么意义吗?
欢迎大家讨论,谢谢。 不知道楼主那个gbk字符集中的汉字是怎么插入进去的。
我特意将server的字符集弄成eucgb(gb2312),
00:00000:00001:2011/01/12 06:17:13.25 serverASE's default sort order is:
00:00000:00001:2011/01/12 06:17:13.25 server 'bin_eucgb' (ID = 50)
00:00000:00001:2011/01/12 06:17:13.25 serveron top of default character set:
00:00000:00001:2011/01/12 06:17:13.25 server 'eucgb' (ID = 170).
然后client端以cp936字符集方式强制连接,
D:\SybaseASE\ASE-15_0\bin>isql -Uspring -Jcp936
Password:
1> use iihero
2> go
1> insert into tb values('赟')
2> go
Msg 2402, Level 16, State 11:
Server '****', Line 1:
Error converting characters into server's character set. Some character(s) could
not be converted.
1> select @@client_csname
2> go
------------------------------
cp936
(1 row affected)
无法插入数据。 你如果采用-Jeucgb就可以成功插进去。 回复 3# Eisen
建议Esien看一下“赟”这个字在ASE中的编码。用dbcc page看一下。
因为早期的时候,很多用西欧字符集cp850来存储汉字,用cp850来存储汉字时,ASE只认识2个字节联在一起是一个汉字,其它就不管了。
我感觉,你的这个情况有点和cp850存储汉字类似。 已经看过了,这个字在GBK里的编码是0xda53,用-Jeucgb的方式写入eucgb的数据库里也是0xda53,用-Jcp936的方式没法写进去,但是可以用select convert(varbinary,'赟')发现会把它转成unicode 0x8d5f。
现在有一个疑问——如果就一直保持数据库的字符集是eucgb而不是cp936或gb18030的话,会有什么不好的地方呢? 你如果不用java,确实没有什么问题。数据库里头只不过存储的是一个内部编码形式。到了客户端,因为你的机器支持该字的显示。 确实如此……不过如果就此不能用java了,实在有点可惜啊。
页:
[1]