调整Sybase ASE使得对象名不区分大小写

Sybase数据库技术博客开通了。欢迎讨论。 Sybase数据库技术,数据库恢复:http://www.dbainfo.net

原文链接:http://www.dbainfo.net/sybase-ase-objectname-case-insensitive.htm
===========================================

在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
————————————————————————————————————

作者: totoo130   发布时间: 2011-03-28

欢迎发贴

作者: wfcjz   发布时间: 2011-03-29

andkylee啊,你家都要给人搬金砖搬空啦。

作者: Eisen   发布时间: 2011-03-29