存档

2010年3月18日 的存档,文章数:3

配置篇

2.1 如何配置字符集的转换类型

禁用字符集转换的配置方法
在isql 环境中执行:
1> sp_configure “disable character set conversion”,1
2> go
“disable character set conversion” 参数默认配置值为0 ,即启用字符集转换。

如何配置字符集的转换类型
把”enable unicode conversions” 参数设置为1 或者2 。当配置为1 时,此设置使用直接转换或Unicode 转换;当配置为2 时,此设置使用Unicode 转换;默 认配置值为0 ,使用直接转换。

在isql 环境中执行:
1> sp_configure ”enable unicode conversions”,1
2> go

2.2 如何配置服务器端缺省字符集
直接转换法
直 接转换法是指直接使用Sybase 提供的实用程序,如UNIX 平台上使用sqlloc 命令或者编辑sqlloc.rs 脚本文件;Windows 平台使用 “ 服务器配置” 图形化管理工具直接配置服务器端字符集。

使用直接转换法的条件是:
―― 服务器中没有用户数据
―― 对服务器中用户数据的损坏是可以接受的
―― 绝对确定服务器中的数据只使用ASCII-7 字符集

间接转换法
间接转换法相对于直接转换法而言,需要通过一下三步来完成配置工作:
1. 先将服务器端的数据使用bcp 命令导出
2. 再选择直接转换法之中的一种方式配置服务器端字符集
3. 再使用带有-J 参数的bcp 命令把数据导回服务器端

配置服务器端字符集的方法 sqlloc— 适用于UNIX 平台的命令
在$SYBASE_OCS/bin 目录下执行:sqlloc ,将出现一个图形化界面,在这个界面中您可以直接选择语言集,字符集,排序顺序,便很容易地就 完成了配置工作。

编辑sqlloc.rs 脚本文件
将$SYBASE-ASE/init /sample_resource_files/sqlloc.rs 拷贝到$SYBASE_OCS/bin 目录下,按以下黑体字提示编辑该文件:
sybinit.release_directory: /home/sybase――― 输入Sybase 产品的安装路径
sqlsrv.server_name: SYB125――― 输入数据库服务器的名称
sqlsrv.sa_login: sa
sqlsrv.sa_password: ――― 输入sa 的口令,若为空,则什么也不填
sqlsrv.default_language: us_english――― 输入想要配置的语言集
sqlsrv.language_install_list: USE_DEFAULT
sqlsrv.language_remove_list: USE_DEFAULT
sqlsrv.default_characterset: cp850――― 输入想要配置的字符集
sqlsrv.characterset_install_list: USE_DEFAULT
sqlsrv.characterset_remove_list: USE_DEFAULT
sqlsrv.sort_order: binary――― 输入想要配置的排序顺序
# An example sqlloc resource file…
# sybinit.release_directory: USE_DEFAULT
# sqlsrv.server_name: PUT_YOUR_SERVER_NAME_HERE
# sqlsrv.sa_login: sa
# sqlsrv.sa_password:
# sqlsrv.default_language: french
# sqlsrv.language_install_list: spanish,german
# sqlsrv.language_remove_list: USE_DEFAULT
# sqlsrv.default_characterset: cp437
# sqlsrv.characterset_install_list: mac,cp850
# sqlsrv.characterset_remove_list: USE_DEFAULT
# sqlsrv.sort_order: dictionary

保存已经修改好的sqlloc.rs 脚本文件,执行以下命令:
sqllocres -r sqlloc.rs

注意屏幕上出现的提示信息,如无异常,则完成配置工作。

服务器配置” 图形化管理工具―― 适用于Windows 平台
“ 服务器配置” 管理工具提供了一个易于操作的图形化管理平台,根据工具中提示的信息,很容易就完成了字符集的配置工作,这里就不多讲了,请参看相关文档说 明。

2.3 如何配置客户端缺省字符集
配置客户端缺省字符集实际上就是对“$SYBASE\locales” 目录下locales.dat 文件的修改。

Windows 平台用写字板方式打开该文件,在UNIX 平台可以直接使用“vi” 命令打开该文件,我们会看到,该文将中所有字符集的配置都是以服务器端操 作系统平台名称分组的:
.
.
[aix]
locale = C, us_english, iso_1
locale = En_US, us_english, iso_1
locale = en_US, us_english, iso_1
locale = default, us_english, iso_1
locale = En_US.IBM-850, us_english, cp850
locale = en_JP, us_english, eucjis
locale = Fr_FR, french, cp850.
.
[axposf]
locale = C, us_english, iso_1
; Use Posix Locales, straight from the Posix Guidelines
locale = en_US.88591, us_english, iso_1
locale = fr_FR, french, iso_1
locale = zh_CN, chinese, eucgb
locale = zh_TW, tchinese, euccns
locale = ko_KR, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1
.
.
其中,操作系统名称放在每一组最开始的“[]” 中,而且请注意上面黑体字,每一组中都会存在一行“locale = default,…” 。我们要修改客户端的默认字符集,就是对这一行进行修改。

例如,某系统服务器端是SUN 平台,服务器端语言集为english ,字符集为cp850 。我们要修改客户端字符集与服务器端一致,怎么做? 首先找到[SUN] 操作系统分组,然后修改“locale = default,…” 为“locale = default,us_English,cp850” 。
修改前:
[sun]
; from JLE, KLE, CLE, OS/4.1.1, man setlocale()
; and Sun Software Internationalization Guide (p/n 800-5972-08)
; use setenv LC_CTYPE, LC_MESSAGES, LANG
locale = C, us_english, iso_1
locale = fr, french, iso_1
locale = de, german, iso_1
locale = tr, us_english, iso88599
locale = zh, chinese, eucgb
locale = zh_CN, chinese, eucgb
locale = zh_TW, tchinese, euccns
locale = ko, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1

修改后:
[sun]
; from JLE, KLE, CLE, OS/4.1.1, man setlocale()
; and Sun Software Internationalization Guide (p/n 800-5972-08)
; use setenv LC_CTYPE, LC_MESSAGES, LANG
locale = C, us_english, iso_1
locale = fr, french, iso_1
locale = de, german, iso_1
locale = tr, us_english, iso88599
locale = zh, chinese, eucgb
locale = zh_CN, chinese, eucgb
locale = zh_TW, tchinese, euccns
locale = ko, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, cp850

保存该文件,就完成对客户端字符集的修改了。

这里,还要说明一种特殊情况:
为了满足服务器端某些应用的特殊需求,在服务器端设置了一个环境变量:LANG, 此时客户端字符集该如何设置呢?

例如,某系统服务器端是Windows 平台,使用语言集english ,字符集iso_1 ,并设置环境变量LANG=C 。我们要修改客户端字符集与服务器 端一致,怎么做?

首先找到[NT] 操作系统分组,然后在该组中加入一行
“locale = C,us_English,iso_1”
修改前:
[NT]
locale = enu, us_english, iso_1
locale = fra, french, iso_1
locale = deu, german, iso_1
locale = japanese, japanese, sjis
locale = chs, chinese, eucgb
locale = cht, tchinese, big5
; locale = kor, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1

修改后:
[NT]
locale = enu, us_english, iso_1
locale = fra, french, iso_1
locale = deu, german, iso_1
locale = japanese, japanese, sjis
locale = chs, chinese, eucgb
locale = cht, tchinese, big5
; locale = kor, korean, eucksc
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1
locale = C,us_English,iso_1
因此在修改客户端字符集之前,请先查看服务器端是否设置了环境变量“LANG“ ,再决定如何修改。

2.4 如何选择ASE 字符集使之支持简体中文字符
目前在ASE 12.5 中支持中文字符的字符集有四种:CP936 ,EUCGB ,UTF-8 和GB18030 。

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

CP936 字符集是基于GBK 编码规范(实际上的国家标准是GB13000-90 ),是对GB2312 进行的扩展,第一字节为0×81~0xFE ,第二字 节分两部分,一是0×40~0×7E ,二是0×80~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 字符集。

另外,还有一种选择是,服务器端和客户端都使用iso_1 字符集,虽然iso_1 字符集并不直接支持中文字符,但我们将服务器端和客户端都设置成 iso_1 字符集后,系统也不会在客户端和服务器端进行字符转换,它只不过将一个汉字的两个字节当做两个单独字符来处理,一般情况下没有问题。但当执行 like 匹配查询的时候,它有可能返回不正确的结果,原因是服务器端是根据单字节去匹配查询条件的,很可能会有前一个汉字的第二字节与后一个汉字的第一字 节的内码组合符合查询条件,被服务器端作为查询结果返回来。

2.5 如何查看服务器端、客户端字符集
查看服务器端字符集:
在isql 环境中执行:
1> sp_helpsort
2> go
查看客户端字符集:
在isql 环境中执行:
1> select @@client_csname
2> go

3. 错误处理篇
3.1 为什么会出现字符集转换失败
1. 当字符存在于客户端字符集中但在服务器字符集中不存在时,Adaptive Server 的字符集转换将报告转换错误,反之亦然。
用户会碰到下面的错误消息:
Msg 2402,Severity 16 (EX_USER):
Error converting client characters into server’s character set. Some character(s) could not be converted.
转换错误会阻止插入与更新语句的执行。如果发生此情况,请检查数据中有问题的字符并替换它们。

2. 当客户端发送数据时Adaptive Server 遇到转换错误,它用ASCII 码的问号(?)代替可疑字符所占字节,但查询批处理继续进行直到完成为止。
语句完成后,Adaptive Server 将发送一下消息:
Msg 2403,Severity 16 (EX_USER):
WARNING! Some character(s) could not be converted into client’s character set. Unconverted bytes were changed to question marks (`?’) 。

3. 当在客户端查询服务器端存储的数据时,当碰到中文汉字,在客户端显示乱码的现象,且没有任何提示信息。这是我们在应用中经常会碰到的现象,产生的原因是: 客户端与服务器端字符集不符。怎么解释呢?假设我们先期设置服务器端字符集为iso_1 ,客户端字符集也为iso_1, 然后我们从客户端向服务器端录入了 所有的数据;之后当我们需要查询时,使用的客户端,它的字符集为cp850 ,那么势必在该客户端上显示的字符集为乱码。

当出现这种情况时,最好配置客户端字符集为先期客户端使用的字符集或者配置客户端字符集与服务器端字符集一致,使得客户端字符集与服务器端字符集匹配。这 里我们不建议用户修改服务器端字符集,因为服务器中此时已经存在大量的数据,在使用直接转换方式时,由于源字符集与目的字符集中可能存在无法转换的字符而 导致Adaptive Server 无法启动;如果使用间接的转换方式,会增加工作量。

4. 附:如何安装cp936 字符集
以在Windows 平台安装cp936 字符集为例,说明如何安装使用服务器中没有被默认安装的字符集。( 在ASE 12.5.0.3 版本中安装GB18030 字符集的方法类似)
( 这里SYBASE 的安装路径为c:\sybase)
1.c:\>cd \sybase\charsets\cp936
2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936
3. 在SQL 环境中 1>select name,id from syscharsets
2>go
找到name 为cp936 对应的id( 假设为171)
4.1>sp_configure "default character set id",171
2>go

5. 重启server 两次
(注: 第一次启动后,server 会自动宕掉,需要第二次重启后才能使用)

EBF

官方软件发行版本。EBF号唯一性地标志了在某个OS平台上的发行版本。

ESD

官方软件发行版本,它解决了当前发行版本中的一些Bug。ESD(ESD #)通常是跨平台的,并且不包含新的特性或功能。ESD是征对某一主版本(major version)的累积软件包,它必须在GA发行版本上安装。

GA

GA(General Availability)是一个SYBASE软件版本全新的、初始听发行版本。除Bug修复之外,它通常包含一些新特性。

IR

IR(Interim Release-中间版本)包含了在此之前的所有ESD发行版本的Bug修复,以及其它Bug修复。IR发行版本必须基于与之对应的GA发行版本的基础上 安装。比如,要安装12.5.0.3,就必须先安装12.5GA(ESD)。

MR

MR(Maintenance Release-维护版本)是GA发行版本的完整替换包。由于它是完整的发行包,因此可以直接安装。通常此种类型的发行版本包含一些新特性以及Bug修复。

先来介绍一下裸设备的知识

1.什么是裸设备(RAW DEVICE)
裸设备是指未创建文件系统的磁盘分区(raw partition)或逻辑卷(raw logical volume),应用程序直接通过一
个字符设备驱动程序对它进行访问。如何对设备上的数据读写决定于使用它的应用程序。由于对裸设备的操作不通过UNIX的缓冲区,数据在ORACLE的数据 缓冲区(BUFFER CACHE)和磁盘之间直接传递,所以使用裸设备在一定程度上能够提高I/O性能,适合I/O量大的系统。另外OPS/RAC (Oracle Parallel Server/Real Application Cluster)环境下,多个节点同时访问同一个数据库,所以CONTROL FILE、DATA FILE、REDO LOG都必须建在RAW DEVICE上。

2.裸设备的可用空间
不同的UNIX对裸设备的管理不完全相同,特别要注意的是某些UNIX在每个裸设备的头部要保留一定的空间,应用程序在使用裸设备时不可以覆盖这一部分, 否则会对裸设备造成损坏。所以一个裸设备的实际可用空间是分配给裸设备的空间再减去这部分操作系统保留空间。下面是常用UNIX的OS Reserved Size列表:
UNIX     OS Reserved Size
------------ ----------------
SUN Solaris       0
HP-UX          0
IBM AIX         4k
Tru64 UNIX       64k
Linux          0
3.如何读裸设备上的数据?

UNIX上读写裸设备不能使用cp, cpio, tar等命令,必须用dd,下面是几个dd常用参数的简单说明,更详细的信息请参考UNIX使用手册或用命令man dd。
dd [ operand=value ... ]
if=file 指定输入文件,缺省值是标准输入
of=file 指定输出文件,缺省值是标准输出
bs=n 设置输入和输出的块大小为n字节,也可以用“k”作单位
skip=n 在拷贝之前跳过n个输入块,缺省值是0
seek=n 在拷贝之前从输出文件首部跳过n块,缺省值是0
count=n 指定拷贝的块数,缺省拷贝到输入文件结束

4.用十六进制读取unix的文件系统上的文件

介绍一下od命令的用法,linux od(octal dump) 命令详解
功能说明:输出文件内容。
语  法:od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]

补充说明:od指令会读取所给予的文件的内容,并将 其内容以八进制字码呈现出来。

参  数:
-a  此参数的效果和同时指定"-ta"参数相同。
-A<字码基 数>  选择要以何种基数计算字码。
-b  此参数的效果和同时指定"-toC"参数相同。
-c  此参数的效果和同时指定"-tC"参数相同。
-d  此参数的效果和同时指定"-tu2"参数相同。
-f  此参数的效果和同时指定"-tfF"参数相同。
-h  此参数的效果和同时指定"-tx2"参数相同。
-i  此参数的效果和同时指定"-td2"参数相同。
-j<字符数目>或--skip-bytes=<字符数目>  略过设置的字符数目。
-l  此参数的效果和同时指定"-td4"参数相同。
-N<字符数目>或--read- bytes=<字符数目>  到设置的字符数目为止。
-o  此参数的效果和同时指定"-to2"参数相同。
-s<字符串字符数>或--strings=<字符串字符数>  只显示符合指定的字符数目的字符串。
-t<输 出格式>或--format=<输出格式>  设置输出格式。
-v或--output-duplicates  输出时不省略重复的数据。
-w<每列字符数>或--width=<每列字符数>  设置每列的最大字符数。
-x  此参数的效果和同时指定"-h"参数相同。
--help  在线帮助。
--version  显示版本信息。

5.实例

用od命令读solaris上的文件,以十六进制的形式显示结果

bash-3.00$ uname -a
SunOS sunv890 5.10 Generic_137111-08 sun4u sparc SUNW,Sun-Fire-V890
bash-3.00$ od -t x4 master.dat | head -10
0000000 00000800 00000002 00000000 00000014
0000020 00000002 00000000 00000005 00000000
0000040 00000019 00008706 0000000c 00002710
0000060 000001f4 00000000 00001000 00000000
0000100 00000064 00000006 00000000 00000000
0000120 00000000 00002000 0000000a 00000001
0000140 4e554c4c 00000000 00000000 00000000
0000160 00002000 00000200 00001000 00000050
0000200 00000000 00000000 00000000 00000000
*
bash-3.00$

上面是我在solaris sparc平台上执行od命令用16进制读取文件的结果。

最左边用红色标记的是偏移量(八进制形式)。如:0000000表示偏移0,0000020表示偏移16(因为0000020(o)=16(d)),0000040表示偏移32。。。

od -t x4 master.dat 这条命令的意思是:用od读取master.dat文件的内容,用16进制的形式显示结果,并且每四个字节为一个显示单位,之间用空格分隔。一般都是每行显示16个字节的数据。

head -10 这条命令的意思是只显示前10行的数据。

在IBM-AIX上读取文件内容

-bash-3.2$ prtconf
System Model: IBM,7044-170
Machine Serial Number: 10D908C
Processor Type: PowerPC_POWER3
Processor Implementation Mode: POWER 630
Processor Version: PV_630
Number Of Processors: 1
Processor Clock Speed: 333 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
以上为系统配置

-bash-3.2$ od -t x4 master.dat |head -10
0000000 00000000 00000000 00000000 00000000
*
0010000 00000800 00000002 00000000 00000014
0010020 00000002 00000000 00000005 00000000
0010040 00000019 00009481 0000000c 00002710
0010060 000001f4 00000000 00001000 00000000
0010100 00000064 00000006 00000000 00000000
0010120 00000000 00002000 0000000a 00000001
0010140 4e554c4c 00000000 00000000 00000000
0010160 00002000 00000200 00001000 00000050
-bash-3.2$

说明:中间的红色星号是od命令显示出来的,非人工添加。最左边红色一列表示偏移量(8进制形式)。第一行的偏移为0,并且结果好像都是0(ascii中的0)。然后第二行的偏移量就变成了4096(0010000(o)=4096(d) )。右边的数据是master.dat文件中的内容。以16进制的形式显示出来,每行16字节,每四个字节为一个单位,之间用空格分隔。

可以看出在ibm-aix powerpc平台上文件系统的数据是从4096偏移处开始存储的。前4096字节的内容为文件的控制信息。

用UltraEdit读取windows平台上的文件master.dat。

00000000 | 00 00 00 00 03 00 00 00 A6 00 00 00 63 00 00 00 | ...........c... | ....¦.c.
00000010 | 01 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 | ................ | ......̀.
00000020 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ | ........
00000030 | 01 00 00 00 00 00 00 00 01 00 00 00 FF 00 00 00 | ............... | ......ÿ.
00000040 | 01 00 00 00 00 00 00 00 01 00 00 00 0F 00 03 00 | ................ | ........
00000050 | 02 00 00 00 00 00 00 00 02 00 00 00 FF 00 00 00 | ............... | ......ÿ.
说明:最左边一列表示偏移量(16进制数据)。中间的部分数据是文件master.dat的内容。

windows上的文件自偏移0开始存储,没有类似ibm-aix上的类似的前4096字节的控制内容。

在linux平台上读取文件的16进制数据的结果,我这边只有一个32bit的虚拟机。就不演示了。

大家可以对比上面的显示结果。发现文件系统或者裸设备的文件可用空间和上面介绍的常用UNIX的OS Reserved Size列表是一致的。

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字:unix hex file system raw device 文件系统 裸设备 od
————————————————————————————————————