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

如何使Sybase ASE中对象名不区分大小写?相关推荐

  1. .net中对象名无效问题解决

    在.net中和数据库链接,对数据库中的表进行操作时如果不注意会出现表名无效.这是因为conn.connectionstring=""中的Database的值没有赋予自己创建的数据库 ...

  2. 关于windows系统安装sybase数据库 服务端和客户端使sybase数据库服务启动失败的问题解决方案以sybase Ase _15.7为例

    关于windows系统安装sybase数据库 服务端和客户端使sybase数据库服务启动失败的问题解决方案以sybase Ase _15.7为例 一.sybase Ase服务安装后能够正常启动,安装s ...

  3. SUSE 11 安装sybase ASE 16.0 SP 02安装全过程

    SUSE系统下安装Sybase数据库 参考文档: https://wiki.deepin.io/mediawiki/index.php?title=Sybase_%E5%AE%89%E8%A3%85% ...

  4. 使用isql连接Sybase ASE数据库的常见错误及处理方式

    使用isql连接Sybase ASE数据库 Sybase ASE客户端工具中有一个比较实用的命令行工具isql.利用isql可以对ASE数据库服务器进行几乎所有的管理维护工作. 下面用isql工具连接 ...

  5. SQL数据库恢复后出现对象名无效(SQL Server备份还原时造成孤立用户的解决方案

    SQL数据库恢复后出现对象名无效(SQL Server备份还原时造成孤立用户的解决方案) 2011-04-18 09:38 以碰到这个烦人的问题,恢复的时候自带了个用户,但怎么也删除不掉,select ...

  6. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法...

    在使用数据库的过程中,经常会碰到数据库迁移或者数据迁移的问题,或者有忽然的数据库损坏,这时需要从数据库的备份中直接恢复.但是,此时会出现问题,这里说明几种常见问题的解决方法. 本文链接:http:// ...

  7. 浅析Java中对象的创建与对象的数据类型转换

    这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下 Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据 ...

  8. C# 对象名无效 问题

    相信有些人访问数据库会出现对象名无效的问题,网上也给出了许多的解决方案,搞了一晚上才查出原因,各种伤不起,现在说一下心得,让后来的学弟学妹们少走点弯路: 实行检查三步走策略,相信三步走之后一般会解决问 ...

  9. netty 压缩比_使Netty 4中的HTTP内容压缩工作

    netty 压缩比 Netty实际上是一个很棒的框架,提供了构建高性能HTTP服务器所需的所有功能. 令人高兴的是,几乎所有东西都是开箱即用的,只是必须以正确的方式组合在一起. 内容压缩 (gzip或 ...

最新文章

  1. 学军中学推理社2017届招新试题
  2. 找工作是一种必须的生活阅历
  3. OpenCASCADE:Modeling Algorithms模块标准拓扑对象
  4. 针对集合中的某个字段对集合中的对象进行排序
  5. 网站开发技巧参考大全转
  6. shell中的常用通配符,字符类
  7. linux死锁的例子,操作系统教程—Linux实例分析 孟庆昌 第8章 死锁new.ppt
  8. iostat linux,iostat 命令详解
  9. 在Docker和Kubernetes上运行MongoDB微服务
  10. Spring结合马士兵视频的学习经验
  11. 移动pc一套代码_【腾讯】如何避免 CDN 为 PC 端缓存移动端页面
  12. 生命游戏(python版)
  13. cp105b linux 驱动,cp105b驱动下载-富士施乐cp105b驱动下载v2.6.15.0 官方最新版-西西软件下载...
  14. poi生成excel并让excel的列有筛选功能
  15. windows server 2003 远程拨号服务器
  16. java中怎么编写一个类_Java入门(8) 创建新类
  17. Android P 禁用OTG U盘使用
  18. 必读论文 | 机器交互必读论文8篇
  19. 曾经排名第一的安全软件,为啥会变成流氓软件?
  20. hibernate-validate如何校验controller+service+分组校验+自定义注解实现校验规则等

热门文章

  1. 搭建网站服务器是选择高配置还是选择性能稳定?
  2. 第0周---python网络爬虫前奏
  3. Golang访问Redis初体验
  4. 使用Windows live Writer 2012发布ChinaUnix博客
  5. 解决Ubuntu中无法连接wifi的方法
  6. 查看PID 进程是否存在的一个小技巧
  7. 杭电 1272 poj 1308 小希的迷宫
  8. 如何让Web.xml变得简洁?
  9. POJ-2635 The Embarrassed Cryptographer 大数取模
  10. 面向对象设计原则之三:里氏替换原则