跳到主要内容

字符串函数概述

字符串函数是用于处理和操作字符串数据的内置函数。它们可以帮助我们执行各种字符串操作,如连接、分割、替换、查找等。

UTF-8 编码支持

UTF-8编码是一种变长的字符编码方式,可以表示世界上几乎所有的字符,包括西里尔字母、希腊字母、汉字、表情等。

在Doris的字符串函数中,如果没有特殊说明,字符串都是支持UTF-8编码的。

例如 substring 函数可以正确处理UTF-8编码的字符串:

ASCII 字符

mysql> SELECT substring('abc1', 2);
+----------------------+
| substring('abc1', 2) |
+----------------------+
| bc1 |
+----------------------+

希腊字母

mysql> SELECT substring('αλφαβητον', 2, 4);
+---------------------------------------+
| substring('αλφαβητον', 2, 4) |
+---------------------------------------+
| λφαβ |
+---------------------------------------+
1 row in set (0.01 sec)

汉字

mysql> SELECT substring('你好,世界', 2, 2);
+------------------------------------+
| substring('你好,世界', 2, 2) |
+------------------------------------+
| 好, |
+------------------------------------+

表情

mysql> SELECT substring('😊😊a😊 World!', 2, 3);
+-----------------------------------------+
| substring('😊😊a😊 World!', 2, 3) |
+-----------------------------------------+
| 😊a😊 |
+-----------------------------------------+

性能考虑

因为UTF-8编码的字符长度不固定,所以在性能上会有一定的影响。一些函数提供了ASCII版本和UTF-8版本以供选择。

例如:

  • length 函数返回字符串的字节长度
  • char_length 函数返回字符串的字符长度
mysql> select length('你好');
+------------------+
| length('你好') |
+------------------+
| 6 |
+------------------+

mysql> select length('αλφαβητον');
+------------------------------+
| length('αλφαβητον') |
+------------------------------+
| 18 |
+------------------------------+

mysql> select char_length('你好');
+-----------------------+
| char_length('你好') |
+-----------------------+
| 2 |
+-----------------------+

mysql> select char_length('αλφαβητον');
+-----------------------------------+
| char_length('αλφαβητον') |
+-----------------------------------+
| 9 |
+-----------------------------------+

特殊说明

一些不支持UTF-8编码的字符串函数,会在文档中进行特别说明,例如NGRAM_SEARCH函数只支持ASCII编码的字符串。

mysql> select ngram_search('abcab' , 'ab' , 2);
+----------------------------------+
| ngram_search('abcab' , 'ab' , 2) |
+----------------------------------+
| 0.5 |
+----------------------------------+

对于非ASCII字符,NGRAM_SEARCH也会执行,但是结果会不符合预期。

mysql> select ngram_search('αβγαβ' , 'αβ' , 2);
+-----------------------------------------+
| ngram_search('αβγαβ' , 'αβ' , 2) |
+-----------------------------------------+
| 0.6666666666666666 |
+-----------------------------------------+