惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 一江水

什么时候使用绑定变量性能反而更差 模拟登录新浪微博(Python) Oracle ASM 详解 Oracle OS Block Header 物化视图日志没有清除 Oracle如何根据物化视图日志快速刷新物化视图 物化视图注册信息的清除 Oracle RAC 碰到 gc buffer busy Oracle RAC 常用维护工具和命令 RAC Debug开关修改工具 Java连接Sybase ASE数据库的一个简单例子 中文图解Python脚本 解决sybase中文以及大小写问题(服务器端)(utf8 乱码) 使用 Oracle 数据库 10g内部的 ETL 基础架构 Oracle代理用户(Proxy User) Android系统手机端抓包方法 RAC中如何更改对外网卡和内部互联网卡的IP及VIP ORA-12545: 因目标主机或对象不存在, 连接失败 Oracle数据块损坏恢复总结[转]
如何使Sybase ASE中对象名不区分大小写?
一江水 · 2012-10-09 · via 博客园 - 一江水

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