存档

文章标签 ‘字符集’,文章数:8

第三方工具连接ASE时,主要使用的接口方法包括:open-client 、ADO.NET和 jdbc。

第三方工具主要包括:
使用open-client接口的工具有:PowerBuilder、DBArtisan、Werysoft QweryBuilder等;WinSQL有自己的数据链接库,类似open-client方式;
使用jdbc接口的工具有:Aqua Data Studio、DbVisualizer、RazorSQL、DBeaver、DBArtisan 等;
使用ADO.NET接口的工具有:Toad for Sybase等;

解决方法:

使用open-client接口时,不需要将disable character set convers设置为1,仅需要在客户端工具中将显示字符集调整为服务器端字符集,可能有时候也需要调整一下显示的字体。
使用jdbc接口时,需要将disable character set convers设置为1,并在jdbc的连接串中将charset设置为cp936。

对于服务器端字符集为:iso_1且参数disable character set convers为默认值0的环境,可在jdbc连接串中添加:?SQLInitString=set char_convert off&charset=cp936

因此:

如果disable character set convers设置为1,两种类型的工具都可以使用。
如果disable character set convers为默认值0,那么建议使用open-client接口的工具。

以上情况适用于服务器端为iso_1,cp936等字符集的情况。

  目前在ASE 15中支持简体中文字符的字符集有四种:CP936,EUCGB,UTF-8和GB18030。

  其中EUCGB字符集是基于GB2312-80编码规范的,它的EUC (Extended Unix Code)编码范围是第一字节0xA1~0xFE(实际只用到0xF7),第二字节0xA1~0xFE。

  CP936字符集是基于GBK编码规范(实际上的国家标准是GB13000-90),是对GB2312进行的扩展,第一字节为0x81~0xFE,第二字节分两部分,一是0x40~0x7E,二是0x80~0xFE。其中和GB2312相 同的区域,字完全相同。

  GB18030字符集(国家标准号是GB18030-2000)是2000年3月17日发布的新的中文编码标准。它是GB2312的扩充,采用单/双 /四字节编码体系结构,收录了27000多个汉字以及臧文、蒙文、维吾尔文等主要的少数民族文字。Sybase 从ASE 12.5.0.3之后开始支持 GB18030字符集。

  UTF-8字符集是现有ASCII系统向Unicode转换的一个过渡方案。它使用1-3字节表示一个字符。简体中文的每个字符在utf8中的长度基本上都是3个字节。它的最主要的优点是可以同时支持超过650种语言的字符。缺点是针对中文字符来说,需要增加50%的空间用来存储。还有一个问题是执行sp_helptext显示存储过程体的时候,有可能出现半个汉字。

  一般来说,由于 EUCGB不支持国标一、二级字库以外的汉字,所以我们推荐用户在服务器端和客户端都使用CP936字符集,或者在ASE 12.5.0.3之后还可以使用GB18030字符集,它可以支持一些比较生僻的汉字。它的不足是只有一种排序方式,即区分大小写的Binary方式。所以,如果需要使用支持中文字符集且不区分大小写的数据库时,就只能使用UTF-8作为服务器端字符集,而客户端使用CP936或GB18030字符集。
  eucgb、cp836、gb18030仅支持区分大小写的排序顺序,utf-8支持不区分大小写的排序。

Sybase ASE15.0及以后的版本中的bcp命令实用工具中有个-Y参数,这个参数的作用是:禁用在服务器中的字符集转化,在使用bcp in时由bcp在客户端上执行字符集转化过程。

只有ASE15.0或更高版本中支持客户端unicode转化。

另外:所有字符集转化都是在bcp out期间在服务器中执行的。

 

 

 

 

用sybase自带的客户端工具sybase central连接ase的时候,如果连接字符集设置不合适,查询结果中汉字会出现乱码。

如果ASE数据库的字符集为:iso_1或者cp850,执行:

sp_configure "disable character set conversi",1

go

修改此配置参数,需要重启ASE服务器。

然后,在sybase central连接配置窗口中,将Character set调整为:cp936。必须设置Character set这个参数,否则sybase central中显示的汉字肯定是乱码,这和sybase central使用的jdbc驱动有关。

其实,将Character set也可以调整为:eucgb,gb18030,这些都是支持中文的字符集。

另外,如果ASE服务器的字符集为:cp936或者utf8,可以不用修改参数disable character set conversi为:1。仅仅通过调整Character set为:cp936 也能解决汉字显示乱码的问题。

安装中文语言支持、配置字符集

         windows平台上,Sybase ASE15.0.3安装完成后默认语言是:英语(us_english),默认字符集为:cp850cp850是一个西欧字符集,虽然也能使用cp850字符集保存汉字,但是不推荐在生产环境中使用该字符集。

         如果生产系统中Sybase ASE数据库仅考虑支持简体中文的话,则可以使用cp936或者utf8这两种字符集。如果需要国际化支持,那么需选择utf8字符集。

         在生产环境中,需要将默认字符集由cp850调整为utf8(或者调整成支持简体中文的cp936也可以,根据项目情况而定!),将默认语言调整为中文。

         备注:如果想设定ASE的默认语言为中文,必须先将默认字符集设定为utf8,才能设置默认语言为中文。否则会报错。

1查看当前数据库的默认字符集:

执行:

sp_configure "default character set id"

go

查看到Run Value为:2,执行:

select id,name from master..syscharsets where id=2

go

查看到当前字符集为:cp850

在Sybase ASE中默认的情况是对象名或者字段名区分大小写,数据库内的字符按照二进制进行排序。单字节字符就按照字符的ASCII值排序,对于多字节(如:一个汉字)字符则是按照第一个字节的ASCII值进行排序。此时,汉字的排序是没有意义的。

但是,有时候会遇到要求对象名或者对象字段名不区分大小写的情况。比如:将其他rdbms的数据库移植到sybase ASE数据库(比如:ASA,oracle等);业务系统要求对象名不区分大小写等场景。

本文介绍在Sybase ASE 15.0.3中调整字符集和排序顺序使得ASE不区分对象名和字段名的大小写。

在谈到数据库的字符集时,不得不提到数据库的排序顺序。字符集和排序顺序的关系如此紧密,必须同时调整二者才能实现在ASE中不区分对象名的大小写。

ASE中的字符集有很多种,随着版本的升级,好像字符集种类也是越来越丰富。在ASE11.9.2版本中还没有支持简体中文的字符集cp936,仅有eucgb这个中文字符集。在最新的ASE15.x版本中,可以用作简体中文的字符集有:cp936,eucgb,gb18030,utf8;支持繁体中文的字符集有:cp950,big5,big5hk,euccns,utf8。如果仅仅需要支持简体中文的话,那么用cp936足够了。考虑ASE数据库支持国际化,则可选用utf8。

如何既支持简体中文又能容纳繁体中文呢?

对于此问题,我感觉应该用utf8字符集。因为在ASE中简体或者繁体中文分别有不同的字符集,只能选择一个最“包容”,范围最广的字符集:utf8。

转入正题:

我的测试环境安装的ASE字符集为:iso_1,默认的字符集排序顺序为:bin__iso_1。无论对象名还是对象内的数据,都是严格区分大小写的。

第一步:检查数据库内是否安装了不区分大小写的iso_1字符集。

select id,name from master..syscharsets where name like '%iso_1%'

查询结果为:

1> select id,name from master..syscharsets where name like '%iso_1%'
2> go
 id  name
 --- ------------------------------
 50 bin_iso_1
 1 iso_1
 
(2 rows affected)

说明数据库内安装有iso_1字符集和按照二进制值进行排序的bin_iso_1(排序顺序在其他rdbms中好像被称为collate,不太好翻译,有的翻译为“整理”,感觉很别扭。在mssqlserver和mysql中都有这个概念。)

第二步:安装不区分大小的iso_1的整理collate

切换到字符集目录下:

cd %sybase%\charsets\iso_1 (unix下位:cd $SYBASE/charsets/iso_1)

发现D:\sybase\charsets\iso_1中有几个*.srt文件,它们分别对应不同的“整理”--排序顺序。

D:\sybase\charsets\iso_1>dir *.srt
 驱动器 D 中的卷没有标签。
 卷的序列号是 24C3-2A76
 
 D:\sybase\charsets\iso_1 的目录
 
2004-11-02  02:13               656 binary.srt
2004-11-02  02:13             8,703 dictiona.srt
2004-11-02  02:13             8,703 dictionary.srt
2004-11-02  02:13             8,669 espdict.srt
2004-11-02  02:13             8,682 espnoac.srt
2004-11-02  02:13             8,584 espnocs.srt
2004-11-02  02:13             8,738 noaccent.srt
2004-11-02  02:13             8,738 noaccents.srt
2004-11-02  02:13             9,209 nocase.srt
2004-11-02  02:13             9,312 nocasepr.srt
2004-11-02  02:13             9,312 nocasepref.srt
 11 个文件         89,306 字节
 0 个目录 17,730,179,072 可用字节
 
D:\sybase\charsets\iso_1>

其中:binary.srt表示二进制排序,dictiona.srt表示按照字典顺序,nocase.srt表示不区分大小的排序(具体的还有:nocasepr.srt,nocasepref.srt,好像是dictionary order,case insensitive with preference,具体没有细研究!)

本文的场景需要nocase.srt这个。

安装nocase.srt这个排序顺序(“整理”)

charset -Usa -P -Stest nocase.srt iso_1

D:\sybase\charsets\iso_1>charset -Usa -P -Stest nocase.srt iso_1
Loading file 'nocase.srt'.
 
Found a [sortorder] section.
 
This is Class-1 sort order.
 
Character set for the sort order is already in the Syscharsets table.
 
Sort order (ID = 52 ,CSID = 1 ) with NAME = 'nocase_iso_1' already exists
in the Syscharsets system table.  Do you wish to update this sort order
with the definitions found in your localization file for sort order
(ID = 52, CSID = 1, NAME = 'nocase_iso_1')?
(yes/no):  yes
 
Finished loading file 'nocase.srt'.
 
1 sort order loaded successfully

第三步:在ASE中配置数据库的排序顺序。

首先,检查ASE当前的排序顺序,用sp_helpsort这个系统存错过程。在输出结果的Sort Order Description部分,看到有:

Sort Order Description
 
 ------------------------------------------------------------------
 Character Set = 1, iso_1
 ISO 8859-1 (Latin-1) - Western European 8-bit character set.
 Sort Order = 50, bin_iso_1
 Binary ordering, for the ISO 8859/1 or Latin-1 character set (
 iso_1).
Characters, in Order

可看出当前排序顺序为:区分大小写的二进制顺序bin_iso_1。

利用如下的SQL语句检查刚才安装的nocase.srt排序顺序在syscharsets表中对应的id值。

select id,name from master.dbo.syscharsets where name like '%iso_1%'

1> select id,name from master.dbo.syscharsets where name like '%iso_1%'
2> go
 id  name
 --- ------------------------------
 50 bin_iso_1
 1 iso_1
 52 nocase_iso_1
 
(3 rows affected)
1>

刚才安装的不区分大小写的排序对应ID为:52。

利用系统存储过程sp_configure 修改默认排序顺序,执行: sp_configure  "default sortorder id",52

执行完毕后,需要重启启动ASE两次(这和改字符集的时候是一样的,)。

ASE启动之后,用sp_configure  "default sortorder id"检查,当前排序顺序值为:52.

用sp_helpsort检查,Sort Order Description部分的信息为:

Sort Order Description
 
 ------------------------------------------------------------------
 Character Set = 1, iso_1
 ISO 8859-1 (Latin-1) - Western European 8-bit character set.
 Sort Order = 52, nocase_iso_1
 Case-insensitive dictionary sort order for use with several We
 stern-European languages including English, French, and German
 .  Uses the ISO 8859-1 character set.
Characters, in Order

发现,已经修改完成了。下面做个试验测试一下。

1> use andkylee
2> go
1> create table ANDKylee(ID int not null,NaMe varchar(30) null)
2> go
1> create table andkylee(id int not null,name varchar(30) null)
2> go
Msg 2714, Level 16, State 1:
Server 'TEST', Line 1:
There is already an object named 'andkylee' in the database.
1> insert into ANDKYLEE values(1,'aaaa')
2> insert into andkylee values(1,'AAAA')
3> insert into aNDKYLEE values(2,'bbBB')
4> insert into andkyLEE values(2,'BBbb')
5> go
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
1> select *  from andkyLEE where name='AAAA'
2> go
 ID          NaMe
 ----------- ------------------------------
 1 aaaa
 1 AAAA
 
(2 rows affected)
1> select *  from andkylee where name='aaaa'
2> go
 ID          NaMe
 ----------- ------------------------------
 1 aaaa
 1 AAAA
 
(2 rows affected)
1> select *  from andkylee where name='BbBb'
2> go
 ID          NaMe
 ----------- ------------------------------
 2 bbBB
 2 BBbb
 
(2 rows affected)
1> select *  from ANDKYLEE order by name
2> go
 ID          NaMe
 ----------- ------------------------------
 1 AAAA
 1 aaaa
 2 BBbb
 2 bbBB
 
(4 rows affected)
1>

可以发现,对象名,字段名,还有表内的数据都不区分大小写了。

最后强调两点:

1.改成不区分大小写的排序顺序要慎重。对象名或者字段名不区分大小写可能问题不多,需要慎重考虑表内数据是否真正地不区分大小写。

2.最好在刚安装完ASE数据库服务器后修改数据库的排序顺序,或者确保各个库内已有的对象名在不区分大小写后是唯一的。我在测试的时候遇到在转化后即将导致sysobjects索引键冲突而失败的情况。

用户库andkylee内原来用testA和testa两种表,在转化的过程报如下的错误:

00:00000:00001:2010/09/06 11:26:34.59 server  Rebuilding indexes for andkylee..sysobjects.
00:00000:00001:2010/09/06 11:26:34.70 server  Error: 1505, Severity: 16, State: 2
00:00000:00001:2010/09/06 11:26:34.71 server  Create unique index aborted on duplicate key.  Primary key is '"testa", 1'
00:00000:00001:2010/09/06 11:26:34.76 server  Error: 3436, Severity: 20, State: 2
00:00000:00001:2010/09/06 11:26:34.76 server  Cannot rebuild index 2 for the 'sysobjects' table in the 'andkylee' database.
00:00000:00001:2010/09/06 11:26:34.76 server  Error: 3434, Severity: 20, State: 1
00:00000:00001:2010/09/06 11:26:34.76 server  Cannot change sortorder. Server shutting down.  Restart to continue with sortorder unchanged.
00:00000:00001:2010/09/06 11:26:34.76 kernel  ueshutdown: exiting
 
 

有问题,欢迎讨论!

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字: ASE 字符集 排序顺序 iso_1 nocase_iso_1 sp_helpsort default sortorder id
————————————————————————————————————

配置篇

2.1 如何配置字符集的转换类型

禁用字符集转换的配置方法
在isql 环境中执行:
1> sp_configure “disable character set conversion”,1
2> go
“disable character set conversion” 参数默认配置值为0 ,即启用字符集转换。

如何配置字符集的转换类型
把”enable unicode conversions” 参数设置为1 或者2 。当配置为1 时,此设置使用直接转换或Unicode 转换;当配置为2 时,此设置使用Unicode 转换;默 认配置值为0 ,使用直接转换。

在isql 环境中执行:
1> sp_configure ”enable unicode conversions”,1
2> go

2.2 如何配置服务器端缺省字符集
直接转换法
直 接转换法是指直接使用Sybase 提供的实用程序,如UNIX 平台上使用sqlloc 命令或者编辑sqlloc.rs 脚本文件;Windows 平台使用 “ 服务器配置” 图形化管理工具直接配置服务器端字符集。

使用直接转换法的条件是:
―― 服务器中没有用户数据
―― 对服务器中用户数据的损坏是可以接受的
―― 绝对确定服务器中的数据只使用ASCII-7 字符集

间接转换法
间接转换法相对于直接转换法而言,需要通过一下三步来完成配置工作:
1. 先将服务器端的数据使用bcp 命令导出
2. 再选择直接转换法之中的一种方式配置服务器端字符集
3. 再使用带有-J 参数的bcp 命令把数据导回服务器端

配置服务器端字符集的方法 sqlloc— 适用于UNIX 平台的命令
在$SYBASE_OCS/bin 目录下执行:sqlloc ,将出现一个图形化界面,在这个界面中您可以直接选择语言集,字符集,排序顺序,便很容易地就 完成了配置工作。

编辑sqlloc.rs 脚本文件
将$SYBASE-ASE/init /sample_resource_files/sqlloc.rs 拷贝到$SYBASE_OCS/bin 目录下,按以下黑体字提示编辑该文件:
sybinit.release_directory: /home/sybase――― 输入Sybase 产品的安装路径
sqlsrv.server_name: SYB125――― 输入数据库服务器的名称
sqlsrv.sa_login: sa
sqlsrv.sa_password: ――― 输入sa 的口令,若为空,则什么也不填
sqlsrv.default_language: us_english――― 输入想要配置的语言集
sqlsrv.language_install_list: USE_DEFAULT
sqlsrv.language_remove_list: USE_DEFAULT
sqlsrv.default_characterset: cp850――― 输入想要配置的字符集
sqlsrv.characterset_install_list: USE_DEFAULT
sqlsrv.characterset_remove_list: USE_DEFAULT
sqlsrv.sort_order: binary――― 输入想要配置的排序顺序
# An example sqlloc resource file…
# sybinit.release_directory: USE_DEFAULT
# sqlsrv.server_name: PUT_YOUR_SERVER_NAME_HERE
# sqlsrv.sa_login: sa
# sqlsrv.sa_password:
# sqlsrv.default_language: french
# sqlsrv.language_install_list: spanish,german
# sqlsrv.language_remove_list: USE_DEFAULT
# sqlsrv.default_characterset: cp437
# sqlsrv.characterset_install_list: mac,cp850
# sqlsrv.characterset_remove_list: USE_DEFAULT
# sqlsrv.sort_order: dictionary

保存已经修改好的sqlloc.rs 脚本文件,执行以下命令:
sqllocres -r sqlloc.rs

注意屏幕上出现的提示信息,如无异常,则完成配置工作。

服务器配置” 图形化管理工具―― 适用于Windows 平台
“ 服务器配置” 管理工具提供了一个易于操作的图形化管理平台,根据工具中提示的信息,很容易就完成了字符集的配置工作,这里就不多讲了,请参看相关文档说 明。

2.3 如何配置客户端缺省字符集
配置客户端缺省字符集实际上就是对“$SYBASE\locales” 目录下locales.dat 文件的修改。

Windows 平台用写字板方式打开该文件,在UNIX 平台可以直接使用“vi” 命令打开该文件,我们会看到,该文将中所有字符集的配置都是以服务器端操 作系统平台名称分组的:
.
.
[aix]
locale = C, us_english, iso_1
locale = En_US, us_english, iso_1
locale = en_US, us_english, iso_1
locale = default, us_english, iso_1
locale = En_US.IBM-850, us_english, cp850
locale = en_JP, us_english, eucjis
locale = Fr_FR, french, cp850.
.
[axposf]
locale = C, us_english, iso_1
; Use Posix Locales, straight from the Posix Guidelines
locale = en_US.88591, us_english, iso_1
locale = fr_FR, french, iso_1
locale = zh_CN, chinese, eucgb
locale = zh_TW, tchinese, euccns
locale = ko_KR, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1
.
.
其中,操作系统名称放在每一组最开始的“[]” 中,而且请注意上面黑体字,每一组中都会存在一行“locale = default,…” 。我们要修改客户端的默认字符集,就是对这一行进行修改。

例如,某系统服务器端是SUN 平台,服务器端语言集为english ,字符集为cp850 。我们要修改客户端字符集与服务器端一致,怎么做? 首先找到[SUN] 操作系统分组,然后修改“locale = default,…” 为“locale = default,us_English,cp850” 。
修改前:
[sun]
; from JLE, KLE, CLE, OS/4.1.1, man setlocale()
; and Sun Software Internationalization Guide (p/n 800-5972-08)
; use setenv LC_CTYPE, LC_MESSAGES, LANG
locale = C, us_english, iso_1
locale = fr, french, iso_1
locale = de, german, iso_1
locale = tr, us_english, iso88599
locale = zh, chinese, eucgb
locale = zh_CN, chinese, eucgb
locale = zh_TW, tchinese, euccns
locale = ko, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1

修改后:
[sun]
; from JLE, KLE, CLE, OS/4.1.1, man setlocale()
; and Sun Software Internationalization Guide (p/n 800-5972-08)
; use setenv LC_CTYPE, LC_MESSAGES, LANG
locale = C, us_english, iso_1
locale = fr, french, iso_1
locale = de, german, iso_1
locale = tr, us_english, iso88599
locale = zh, chinese, eucgb
locale = zh_CN, chinese, eucgb
locale = zh_TW, tchinese, euccns
locale = ko, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, cp850

保存该文件,就完成对客户端字符集的修改了。

这里,还要说明一种特殊情况:
为了满足服务器端某些应用的特殊需求,在服务器端设置了一个环境变量:LANG, 此时客户端字符集该如何设置呢?

例如,某系统服务器端是Windows 平台,使用语言集english ,字符集iso_1 ,并设置环境变量LANG=C 。我们要修改客户端字符集与服务器 端一致,怎么做?

首先找到[NT] 操作系统分组,然后在该组中加入一行
“locale = C,us_English,iso_1”
修改前:
[NT]
locale = enu, us_english, iso_1
locale = fra, french, iso_1
locale = deu, german, iso_1
locale = japanese, japanese, sjis
locale = chs, chinese, eucgb
locale = cht, tchinese, big5
; locale = kor, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1

修改后:
[NT]
locale = enu, us_english, iso_1
locale = fra, french, iso_1
locale = deu, german, iso_1
locale = japanese, japanese, sjis
locale = chs, chinese, eucgb
locale = cht, tchinese, big5
; locale = kor, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1
locale = C,us_English,iso_1
因此在修改客户端字符集之前,请先查看服务器端是否设置了环境变量“LANG“ ,再决定如何修改。

2.4 如何选择ASE 字符集使之支持简体中文字符
目前在ASE 12.5 中支持中文字符的字符集有四种:CP936 ,EUCGB ,UTF-8 和GB18030 。

其中EUCGB 字符集是基于GB2312-80 编码规范的,它的EUC (Extended Unix Code) 编码范围是第一字节0xA1~0xFE( 实际只用到0xF7) ,第二字节0xA1~0xFE 。

CP936 字符集是基于GBK 编码规范(实际上的国家标准是GB13000-90 ),是对GB2312 进行的扩展,第一字节为0×81~0xFE ,第二字 节分两部分,一是0×40~0×7E ,二是0×80~0xFE 。其中和GB2312 相 同的区域,字完全相同。

GB18030 字符集(国家标准号是GB18030-2000 )是2000 年3 月17 日发布的新的中文编码标准。它是GB2312 的扩充,采用单/ 双/ 四 字节编码体系结构,收录了27000 多个汉字以及臧文、蒙文、维吾尔文等主要的少数民族文字。Sybase 从ASE 12.5.0.3 之后开始支持GB18030 字符集。

UTF-8 字符集是现有ASCII 系统向Unicode 转换的一个过渡方案。它使用1-3 字节表示一个字符。简体中文的每个字符在utf8 中的长度基本上 都是3 个字节。它的最主要的优点是可以同时支持超过650 种语言的字符。缺点是针对中文字符来说,需要增加50% 的空间用来存储。还有一个问题是执行 sp_helptext 显示存储过程体的时候,有可能出现半个汉字。

一般来说,由于EUCGB 不支持国标一、二级字库以外的汉字,所以我们推荐用户在服务器端和客户端都使用CP936 字符集,或者在ASE 12.5.0.3 之后还可以使用GB18030 字符集,它可以支持一些比较生僻的汉字。它的不足是只有一种排序方式,即区分大小写的Binary 方式。所 以,如果需要使用支持中文字符集且不区分大小写的数据库时,就只能使用UTF-8 作为服务器端字符集,而客户端使用CP936 或GB18030 字符集。

另外,还有一种选择是,服务器端和客户端都使用iso_1 字符集,虽然iso_1 字符集并不直接支持中文字符,但我们将服务器端和客户端都设置成 iso_1 字符集后,系统也不会在客户端和服务器端进行字符转换,它只不过将一个汉字的两个字节当做两个单独字符来处理,一般情况下没有问题。但当执行 like 匹配查询的时候,它有可能返回不正确的结果,原因是服务器端是根据单字节去匹配查询条件的,很可能会有前一个汉字的第二字节与后一个汉字的第一字 节的内码组合符合查询条件,被服务器端作为查询结果返回来。

2.5 如何查看服务器端、客户端字符集
查看服务器端字符集:
在isql 环境中执行:
1> sp_helpsort
2> go
查看客户端字符集:
在isql 环境中执行:
1> select @@client_csname
2> go

3. 错误处理篇
3.1 为什么会出现字符集转换失败
1. 当字符存在于客户端字符集中但在服务器字符集中不存在时,Adaptive Server 的字符集转换将报告转换错误,反之亦然。
用户会碰到下面的错误消息:
Msg 2402,Severity 16 (EX_USER):
Error converting client characters into server’s character set. Some character(s) could not be converted.
转换错误会阻止插入与更新语句的执行。如果发生此情况,请检查数据中有问题的字符并替换它们。

2. 当客户端发送数据时Adaptive Server 遇到转换错误,它用ASCII 码的问号(?)代替可疑字符所占字节,但查询批处理继续进行直到完成为止。
语句完成后,Adaptive Server 将发送一下消息:
Msg 2403,Severity 16 (EX_USER):
WARNING! Some character(s) could not be converted into client’s character set. Unconverted bytes were changed to question marks (`?’) 。

3. 当在客户端查询服务器端存储的数据时,当碰到中文汉字,在客户端显示乱码的现象,且没有任何提示信息。这是我们在应用中经常会碰到的现象,产生的原因是: 客户端与服务器端字符集不符。怎么解释呢?假设我们先期设置服务器端字符集为iso_1 ,客户端字符集也为iso_1, 然后我们从客户端向服务器端录入了 所有的数据;之后当我们需要查询时,使用的客户端,它的字符集为cp850 ,那么势必在该客户端上显示的字符集为乱码。

当出现这种情况时,最好配置客户端字符集为先期客户端使用的字符集或者配置客户端字符集与服务器端字符集一致,使得客户端字符集与服务器端字符集匹配。这 里我们不建议用户修改服务器端字符集,因为服务器中此时已经存在大量的数据,在使用直接转换方式时,由于源字符集与目的字符集中可能存在无法转换的字符而 导致Adaptive Server 无法启动;如果使用间接的转换方式,会增加工作量。

4. 附:如何安装cp936 字符集
以在Windows 平台安装cp936 字符集为例,说明如何安装使用服务器中没有被默认安装的字符集。( 在ASE 12.5.0.3 版本中安装GB18030 字符集的方法类似)
( 这里SYBASE 的安装路径为c:\sybase)
1.c:\>cd \sybase\charsets\cp936
2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936
3. 在SQL 环境中 1>select name,id from syscharsets
2>go
找到name 为cp936 对应的id( 假设为171)
4.1>sp_configure "default character set id",171
2>go

5. 重启server 两次
(注: 第一次启动后,server 会自动宕掉,需要第二次重启后才能使用)

将Sybase的字符集调整为支持简体中文的cp936字符集。

 步骤如下:

(这里假设SYBASE的安装路径为c:\sybase) 
1.c:\>cd \sybase\charsets\cp936
2.c:\sybase\charsets\cp936> charset -U用户名 -P密码 -S数据库服务器名称 binary.srt cp936

更改默认字符集为cp936
3.在SQL环境中
1>select name,id from syscharsets(会列出字符集对应的id号)
2>go
找到name为cp936对应的id(假设为171)
.1>sp_configure "default character set id",171
2>go
5.重启server两次
(注:第一次启动后,server会自动宕掉,需要第二次重启后才能使用)

启动之后,要清空日志。应该是sybase日志恢复时不会转换字符集吧,所以先前的日志没有作用了。要及时清除掉!
清空提交日志dump tran dbname with  truncate_only

=====================================================================

SYBASE使用utf8字符集出现乱码问题的解决

于国际化的原因,现在使用sybase15.0.3字符集utf8作为默认字符集,现在客户端与服务端一致都配置成为 locale=default,us_english,utf8 ,发现使用客户端写入数据后,汉字全为乱码。在isql下用iso_1,cp850字符集连接上,查询已有数据汉字全为乱码。

解决的办法:

将客户端改为cp936,或者在isql连接的时候指定字符集为简体中文字符集cp936即-Jcp936。

问题解决!

ps:在isql查看客户端字符集为:select @@client_csname
查看服务器的默认排序顺序:sp_configure "default sortorder"

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字:  ASE 字符集 简体中文  CP936 UTF8 乱码
————————————————————————————————————