天天看點

調整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%'

 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 = 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.

發現,已經修改完成了。下面做個試驗測試一下。

1> USE andkylee

1> CREATE TABLE ANDKylee(ID int NOT NULL,NaMe varchar(30) NULL)

1> CREATE TABLE andkylee(id int NOT NULL,name varchar(30) NULL)

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> SELECT * FROM andkyLEE WHERE name='AAAA'

 ID NaMe

 ----------- ------------------------------

 1 aaaa

 1 AAAA

1> SELECT * FROM andkylee WHERE name='aaaa'

1> SELECT * FROM andkylee WHERE name='BbBb'

 2 bbBB

 2 BBbb

1> SELECT * FROM ANDKYLEE ORDER BY name

(4 rows affected)

可以發現,對象名,字段名,還有表内的資料都不區分大小寫了。

最後強調兩點:

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

繼續閱讀