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