Eisen 发表于 2011-01-11 19:14

讨论一下ASE的字符集

现在ase的缺省字符集是eucgb,也就是gb2312,但我发现如果不用univarchar或unichar或者其他unicode的客户程序例如java,client程序也都能正确识别汉字出来。
例如:"赟"这个字就不在gb2312里,而是存在于gbk(cp936)里,可是如果create table tb(str varchar(10)),然后insert tb values("赟")
然后怎么查也没有错嘛。那么把数据库的字符集升级到cp936甚至gb18030还有什么意义吗?
欢迎大家讨论,谢谢。

ehero 发表于 2011-01-12 06:47

不知道楼主那个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)

无法插入数据。

Eisen 发表于 2011-01-12 08:59

你如果采用-Jeucgb就可以成功插进去。

andkylee 发表于 2011-01-12 12:59

回复 3# Eisen


   建议Esien看一下“赟”这个字在ASE中的编码。用dbcc page看一下。
因为早期的时候,很多用西欧字符集cp850来存储汉字,用cp850来存储汉字时,ASE只认识2个字节联在一起是一个汉字,其它就不管了。
我感觉,你的这个情况有点和cp850存储汉字类似。

Eisen 发表于 2011-01-12 13:06

已经看过了,这个字在GBK里的编码是0xda53,用-Jeucgb的方式写入eucgb的数据库里也是0xda53,用-Jcp936的方式没法写进去,但是可以用select convert(varbinary,'赟')发现会把它转成unicode 0x8d5f。

现在有一个疑问——如果就一直保持数据库的字符集是eucgb而不是cp936或gb18030的话,会有什么不好的地方呢?

ehero 发表于 2011-01-12 16:39

你如果不用java,确实没有什么问题。数据库里头只不过存储的是一个内部编码形式。到了客户端,因为你的机器支持该字的显示。

Eisen 发表于 2011-01-12 17:09

确实如此……不过如果就此不能用java了,实在有点可惜啊。
页: [1]
查看完整版本: 讨论一下ASE的字符集