存档

‘Sybase ASE’ 分类的存档,文章数:183

  目前在ASE 15中支持简体中文字符的字符集有四种:CP936,EUCGB,UTF-8和GB18030。

  其中EUCGB字符集是基于GB2312-80编码规范的,它的EUC (Extended Unix Code)编码范围是第一字节0xA1~0xFE(实际只用到0xF7),第二字节0xA1~0xFE。

  CP936字符集是基于GBK编码规范(实际上的国家标准是GB13000-90),是对GB2312进行的扩展,第一字节为0x81~0xFE,第二字节分两部分,一是0x40~0x7E,二是0x80~0xFE。其中和GB2312相 同的区域,字完全相同。

  GB18030字符集(国家标准号是GB18030-2000)是2000年3月17日发布的新的中文编码标准。它是GB2312的扩充,采用单/双 /四字节编码体系结构,收录了27000多个汉字以及臧文、蒙文、维吾尔文等主要的少数民族文字。Sybase 从ASE 12.5.0.3之后开始支持 GB18030字符集。

  UTF-8字符集是现有ASCII系统向Unicode转换的一个过渡方案。它使用1-3字节表示一个字符。简体中文的每个字符在utf8中的长度基本上都是3个字节。它的最主要的优点是可以同时支持超过650种语言的字符。缺点是针对中文字符来说,需要增加50%的空间用来存储。还有一个问题是执行sp_helptext显示存储过程体的时候,有可能出现半个汉字。

  一般来说,由于 EUCGB不支持国标一、二级字库以外的汉字,所以我们推荐用户在服务器端和客户端都使用CP936字符集,或者在ASE 12.5.0.3之后还可以使用GB18030字符集,它可以支持一些比较生僻的汉字。它的不足是只有一种排序方式,即区分大小写的Binary方式。所以,如果需要使用支持中文字符集且不区分大小写的数据库时,就只能使用UTF-8作为服务器端字符集,而客户端使用CP936或GB18030字符集。
  eucgb、cp836、gb18030仅支持区分大小写的排序顺序,utf-8支持不区分大小写的排序。

迁移ASE数据库的表结构时,需要注意表DDL的顺序,否则有些对象会因为其所引用的对象不存在而导致创建不成功。

解决的方法:将同样的脚本执行两次。

据我所知,sybase central或者ddlgen导出的语法中是没有很好的处理好对象之间的引用先后顺序的,所以,很有可能你的脚本需要执行两次才能保证所有的对象都成功创建上。

下面举个简单的例子,两张表,一张外键引用另一张。

sybase ASE中要求被外键引用的表的被引用列上有唯一约束。

在移植对象DDL的时候,举个例子:表A外键引用表B,如果导出的DLL语句中表A的定义语句在前面,而表B的DDL在后面。那么在创建表A的时候会因为外键引用的表B不存在而导致表A创建不成功。表B是能够成功创建的。

第二次执行上面相同的脚本时,首先会成功创建表A,因为其所引用的表B已经创建上了。而表B不会再次创建因为上次执行的时候已建上,会给出一个错误信息。这在isql是个错误信息,可能在sybase central中会是一个让人讨厌的弹出窗口。

以YYYYMMDDHHMMSS的格式显示日期的SQL语句为:

其中日期部分:convert(varchar,getdate(),112)

时间部分为:convert(varchar,getdate(),108)

需要将时间部分的:16:18:45里的冒号去掉。使用函数:str_replace,将冒号去掉,注意是NULL而不是空字符。

1> select str_replace(convert(varchar,getdate(),108),':',NULL)
2> go

 ------------------------------
 162014

完整的SQL语句为:

str_replace(convert(varchar,getdate(),112) + convert(varchar,getdate(),108) , ':',NULL)

ASE自15.0后增加了3中语义分区:hash、range、list。默认的轮询分区(roundrobin)为非语义分区,是为了兼容15.0之前的版本而设计的。

语义分区表的分区信息主要存储在:syspartitions和syspartitionkeys这两张表中。

查看表的分区信息可以使用系统自带的存储过程:sp_helpartition

本文提供3个SQL语句:

  1. 如何判断一个表是否是分区表?

select count(*) from dbo.syspartitionkeys where id=object_id(table_name)

示例:

1> if exists(select 1 from dbo.syspartitionkeys where id = object_id("PART_RESDISK"))

2> print "table PART_RESDISK exists!"

3> else

4> print "table PART_RESDISK not exists!"

5> go

table PART_RESDISK exists!

ASE15.0中的表默认为roundrobin类型的"分区表",系统表syspartitionkeys表中仅仅记录语义分区表的分区键信息。

linux x86 平台上的 ASE15.5 的 dat文件,拷贝到windows x86 平台上的ASE15.5中,是可以使用的。
只需要简单的修改master.dat中的device路径即可。 通过更改sysdevices的phyname来实现。

将sysdatabases系统表中status - 64 

之后, 利用dbcc checkdb,dbcc checkalloc,dbcc checkcatalog 检查各个数据库。 没有错误。

说明: linux平台和windows平台的dat文件是通用的。  迁移时只拷贝数据库设备文件就能完成。

在使用ASE15.0.3或者ASE15.5这两个版本的job scheduler的时候,都遇到了需要重建一个表的索引的情况。 这个情况我不止在一台机器上遇到了。

下面是在用ASE15.5自带的Sybase Central中建立日程表的时候出现的错误:

用isql登录数据库,查看一下object_id:1792006384是哪张表,这张表的哪个索引坏了?

连接Sybase ASE服务器,可以使用TCP,NAMEPIPE,SPX等网络协议。利用TCP协议连接ASE服务器时,需要指定ASE服务器所在的IP地址(或者主机名)以及ASE服务器侦听的端口,比如:192.168.0.168:5000。

    但是,每次连接ASE数据库的时候都要输入类似192.168.0.168:5000这样的信息,不仅仅记忆起来麻烦,而且容易混淆。服务器条目就是192.168.0.168:5000等信息的简写形式,记忆一个服务器条目比起IP地址+端口来省事多了。Sybase ASE中的服务器条目类似oracle数据库中的tnsnames的概念。用服务器条目更直观的定位一台Sybase ASE数据库。

    服务器条目中保存的信息主要有:服务器名称,网络协议名称,IP地址(或者主机名),端口号。

 

一、添加服务器条目

在菜单:开始>所有程序>Sybase>Connectivity下找到Open Client Directory Service Editor,运行Open Client Directory Service Editor。

    Open Client Directory Service Editor这个程序文件名为:dsedit。

利用前面介绍的用Sybase Central连接ASE数据库的方法

用Sybase Central连接Sybase ASE数据库 https://www.dbainfo.net/connnect-to-sybase-ase-by-sybase-central-client-tool.htm

成功连接上数据库后,会显示如下的窗口。

如果左边窗口中没有显示如图所示的文件夹列表,那么需要选择菜单视图下的文件夹菜单