COLLATE功能允许你根据语言和国家/地区特定的规则(称为归类)对STRING进行排序。

Collated字符串很重要,因为不同的语言对字母顺序有不同的规则,特别是关于重音字母。例如,在德语中,重音字母与非重音字母一起排序,而在瑞典语中,它们位于字母表的末尾。排序规则是用于排序的一组规则,通常对应于一种语言,但有些语言有多种排序规则,排序规则不同;例如,葡萄牙语对巴西和欧洲方言分别进行了整理(分别为pt-BR和pt-PT)。

细节

支持的Collations

CockroachDB支持Go语言包提供的Collations。<collation>参数是每行末尾的BCP 47语言标记,紧跟在前面的//。 例如,支持南非荷兰语作为afcollection。

SQL 语法

Collated strings作为常规SQL string使用,不过会跟随这一个COLLATE子句。

> CREATE TABLE foo (a STRING COLLATE en PRIMARY KEY);

你还可以使用STRING的任何别名。

> INSERT INTO foo VALUES ('dog' COLLATE en);

示例

为一列指定Collation

您可以为STRING列中的所有值设置默认Collation。

举个例子,你可以设置一列的默认collation为德语 (de):

> CREATE TABLE de_names (name STRING COLLATE de PRIMARY KEY);

将值插入此列时,必须为每个值指定collation:

> INSERT INTO de_names VALUES ('Backhaus' COLLATE de), ('Bär' COLLATE de), ('Baz' COLLATE de);

排序现在将按照de处理,在字母排序中将ä视为 a

> SELECT * FROM de_names ORDER BY name;
+----------+
|   name   |
+----------+
| Backhaus |
| Bär      |
| Baz      |
+----------+

按非默认排序Collation排序

您可以使用特定Collation而不是默认Collation对列进行排序。

例如,如果你按德语(de)和瑞典语(sv)排序结果,则会得到不同的结果:

> SELECT * FROM de_names ORDER BY name COLLATE sv;
+----------+
|   name   |
+----------+
| Backhaus |
| Baz      |
| Bär      |
+----------+

Ad-Hoc Collation Casting

你可以动态地将任何string转换为Collation。

> SELECT 'A' COLLATE de < 'Ä' COLLATE de;
true

不过,你不能将不同collations的值进行比较:

SELECT 'Ä' COLLATE sv < 'Ä' COLLATE de;
pq: unsupported comparison operator: <collatedstring{sv}> < <collatedstring{de}>

你还可以使用强制转换从值中删除collation。

> SELECT CAST(name AS STRING) FROM de_names ORDER BY name;

See Also

Data Types