排序规则
创建排序规则 CREATE COLLATION
作用: 为被支持的字符集制作一个新的排序规则用于数据库中。
用于: DSQL
语法:
CREATE COLLATION collname
FOR charset
[FROM basecoll | FROM EXTERNAL ('extname')]
[NO PAD | PAD SPACE]
[CASE [IN]SENSITIVE]
[ACCENT [IN]SENSITIVE]
[''];
::= [; ...]
::= attrname=attrvalue
表 5.41. CREATE COLLATION 语句参数
参数 | 描述 |
collname | 用于新的排序规则名称。最大长度为 31 个字符 |
charset | 数据库中存在的字符集 |
basecoll | 在数据库中已经存在的排序规则 |
extname | 在.conf 文件中被使用的排序规则名称 |
CREATE COLLATION 语句并没有创建"任何"东西:其目的是使得排序规则对数据库而言是已知的。这个排序规则必须已经存在于当的系统上,通常在一个库文件,且必须正确地在Firebird安装目录下的子目录intl中一个.conf文件注册。
该排序规则可以基于已存在于数据库中的一种。
引擎如何检测排序规则
如果目前没有 FROM 子句,Firebird将在intl子目录中扫描.conf 文件,为CREATE COLLATION对象所指定的排序规则名。换句话说,省略 FROM basecoll 子句是等效于指定FROM EXTERNAL ('collname')。
使用单引号‘extname’是区分大小写的,必须严格地对应在.conf文件中的排序规则名。collname、charset和basecoll参数不区分大小写的,除非用双引号。
特定的属性
可用的特定属性列在下面的表格中。并不是所有的特定属性都适用于每一个排序规则,即使指定它们不会引起错误。
重要
特定的属性是区分大小写的
在表中,"1 bpc"表示一个属性是有效的每个字符使用1字节的字符集的排序规则(所谓的窄字符集)。"UNI"是"Unicode排序规则"。
表 5.42. 特定的排序规则属性
属性 | 值 | 有效于 | 说明 |
DISABLE-COMPRESSIONS | 0, 1 | 1 bpc | 禁用压缩(也称为收缩)。压缩导致某些字符序列作为一个原子单位,例如排序西班语 c + h 作为单个字符 ch |
DISABLE-EXPANSIONS | 0, 1 | 1 bpc | 禁用扩展。扩产导致某些字符(例如连音或变音元音)被视为字符序列并据此排序 |
ICU-VERSION | default or M.m |
UNI | 指定了ICU库版本使用。有效值的定义的适用在intl / < intl_module >元素fbintl.conf。格式:字符串文字"默认"或一个主要版+小版本像"3.0"(双引号内的)。 |
LOCALE | xx_YY | UNI | 指定排序规则定位设置。需要完整的ICU库版本。格式:一个定位设置像这样的字符串"du_nl"(不带引号) |
MULTI-LEVEL | 0, 1 | 1 bpc | 使用一个以上的排序级别 |
NUMERIC-SORT | 0, 1 | UNI | 处理连续分组的十进制数字在字符串中,作为原子单位,并对它们进行排序数值模拟。(这也被称为自然排序) |
SPECIALS-FIRST | 0, 1 | 1 bpc | 指定特殊字符(空格、符号等)在字母数字字符之前 |
小技巧
如果想添加一个新的字符集,将其设置为数据库中默认的排序规则,声明且运行存储过程sp_register_character_set(name, max_bytes_per_character),在Firebird安装目录下的misc/intl.sql文件中。
注意: 为了使这个工作,字符集必须在当前系统中且在注册子目录intl中一个.conf文件中。
所有连接到数据库的用户都能使用CREATE COLLATION来增一个新的排序规则
使用例子CREATE COLLATION:
1. 创建一个排序规则,使用基于fbintl.conf文件中的名称(区分大小)
CREATE COLLATION ISO8859_1_UNICODE FOR ISO8859_1;
2.创建一个排序规则,使用特殊(用户自定义)的名称("external"名称必须完全匹配fbintl.conf文件中的名称)
CREATE COLLATION LAT_UNI
FOR ISO8859_1
FROM EXTERNAL ('ISO8859_1_UNICODE');
3.创建不区分大小写的排序规则,基于已存在于现有数据库中的。
CREATE COLLATION ES_ES_NOPAD_CI
FOR ISO8859_1
FROM ES_ES
NO PAD
CASE INSENSITIVE;
4.创建不区分大小写的排序规则,基于已存在于现有数据库中的并指定属性 .
CREATE COLLATION ES_ES_CI_COMPR
FOR ISO8859_1
FROM ES_ES
CASE INSENSITIVE
'DISABLE-COMPRESSIONS=0';
5. 创建不区分大小写的排序规则由编号的值 (所谓的自然排序规则).
CREATE COLLATION nums_coll FOR UTF8
FROM UNICODE
CASE INSENSITIVE 'NUMERIC-SORT=1';
CREATE DOMAIN dm_nums AS varchar(20)
CHARACTER SET UTF8 COLLATE nums_coll; -- original (manufacturer) numbers
CREATE TABLE wares(id int primary key, articul dm_nums ...);
参阅: DROP COLLATION