メインコンテンツまでスキップ
に最終更新

文字列関数の概要

文字列関数は、文字列データの処理や操作に使用する組み込み関数です。連結、分割、置換、検索など、さまざまな文字列操作を行えます。

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 |
+-----------------------------------------+