文字列関数
TiDB は、 MySQL 5.7で利用可能な文字列関数のほとんど、MySQL 8.0 で利用可能な文字列関数の一部、Oracle 21 で利用可能な関数の一部をサポートしています。
サポートされている関数
名前 | 説明 |
---|---|
ASCII() | 左端の文字の数値を返す |
BIN() | 数値のバイナリ表現を含む文字列を返します |
BIT_LENGTH() | 引数の長さをビット単位で返す |
CHAR() | 渡された整数ごとに文字を返す |
CHAR_LENGTH() | 引数の文字数を返す |
CHARACTER_LENGTH() | CHAR_LENGTH() の同義語 |
CONCAT() | 連結された文字列を返す |
CONCAT_WS() | 区切り文字で連結して返す |
ELT() | インデックス番号の文字列を返す |
EXPORT_SET() | 値ビットに設定されているすべてのビットに対してオン文字列を取得し、設定されていないすべてのビットに対してオフ文字列を取得する文字列を返します。 |
FIELD() | 後続の引数の最初の引数のインデックス(位置)を返します。 |
FIND_IN_SET() | 2番目の引数内の最初の引数のインデックス位置を返します |
FORMAT() | 指定された小数点以下の桁数でフォーマットされた数値を返します。 |
FROM_BASE64() | Base64文字列にデコードして結果を返す |
HEX() | 10進数または文字列値の16進数表現を返します |
INSERT() | 指定した位置に指定した文字数までの部分文字列を挿入します。 |
INSTR() | 部分文字列の最初の出現のインデックスを返す |
LCASE() | LOWER() の同義語 |
LEFT() | 指定された左端の文字数を返す |
LENGTH() | 文字列の長さをバイト単位で返す |
LIKE | シンプルなパターンマッチング |
LOCATE() | 部分文字列の最初の出現位置を返す |
LOWER() | 引数を小文字で返す |
LPAD() | 指定された文字列を左詰めにした文字列引数を返す |
LTRIM() | 先頭のスペースを削除 |
MAKE_SET() | 対応するビットが設定されているコンマ区切りの文字列のセットを返します。 |
MID() | 指定された位置から始まる部分文字列を返す |
NOT LIKE | 単純なパターンマッチングの否定 |
NOT REGEXP | REGEXP の否定 |
OCT() | 数値の8進表現を含む文字列を返します |
OCTET_LENGTH() | LENGTH() の同義語 |
ORD() | 引数の左端の文字の文字コードを返す |
POSITION() | LOCATE() の同義語 |
QUOTE() | SQL文で使用する引数をエスケープする |
REGEXP | 正規表現を使用したパターンマッチング |
REGEXP_INSTR() | 正規表現に一致する部分文字列の開始インデックスを返します(MySQLと部分的に互換性があります。詳細についてはMySQL との正規表現の互換性を参照してください) |
REGEXP_LIKE() | 文字列が正規表現に一致するかどうか(MySQLと部分的に互換性があります。詳細についてはMySQL との正規表現の互換性を参照してください) |
REGEXP_REPLACE() | 正規表現に一致する部分文字列を置換します(MySQLと部分的に互換性があります。詳細についてはMySQL との正規表現の互換性を参照してください) |
REGEXP_SUBSTR() | 正規表現に一致する部分文字列を返します(MySQLと部分的に互換性があります。詳細についてはMySQL との正規表現の互換性を参照してください) |
REPEAT() | 文字列を指定された回数繰り返す |
REPLACE() | 指定された文字列の出現箇所を置換する |
REVERSE() | 文字列内の文字を反転する |
RIGHT() | 指定された右端の文字数を返す |
RLIKE | REGEXP の同義語 |
RPAD() | 文字列を指定された回数追加する |
RTRIM() | 末尾のスペースを削除 |
SPACE() | 指定された数のスペースの文字列を返します |
STRCMP() | 2つの文字列を比較する |
SUBSTR() | 指定された部分文字列を返す |
SUBSTRING() | 指定された部分文字列を返す |
SUBSTRING_INDEX() | 指定された回数の区切り文字より前の文字列から部分文字列を返します。 |
TO_BASE64() | 引数をbase64文字列に変換して返します |
TRANSLATE() | 文字列内のすべての文字を他の文字に置き換えます。Oracle のように空の文字列をNULL として扱いません。 |
TRIM() | 先頭と末尾のスペースを削除する |
UCASE() | UPPER() の同義語 |
UNHEX() | 数値の16進表現を含む文字列を返します |
UPPER() | 大文字に変換 |
WEIGHT_STRING() | 入力文字列の重み文字列を返す |
サポートされていない関数
LOAD_FILE()
MATCH()
SOUNDEX()
MySQL との正規表現の互換性
次のセクションでは、 REGEXP_INSTR()
、 REGEXP_LIKE()
、 REGEXP_REPLACE()
、 REGEXP_SUBSTR()
を含む、MySQL との正規表現の互換性について説明します。
構文の互換性
MySQL は International Components for Unicode (ICU) を使用して正規表現を実装し、TiDB は RE2 を使用します。2 つのライブラリ間の構文の違いについては、 ICUドキュメントとRE2 構文を参照してください。
match_type
互換性
TiDB と MySQL 間のmatch_type
の値オプションは次のとおりです。
TiDB の値オプションは
"c"
、"i"
、"m"
、"s"
であり、MySQL の値オプションは"c"
、"i"
、"m"
、"n"
、"u"
です。TiDB の
"s"
MySQL の"n"
に相当します。TiDB で"s"
設定されている場合、.
文字は行末文字 (\n
) にも一致します。たとえば、MySQL の
SELECT REGEXP_LIKE(a, b, "n") FROM t1
TiDB のSELECT REGEXP_LIKE(a, b, "s") FROM t1
と同じです。TiDB は、MySQL で Unix のみの行末を意味する
"u"
サポートしていません。
データ型の互換性
バイナリ文字列型に対する TiDB と MySQL のサポートの違い:
- MySQL は 8.0.22 以降、正規表現関数でバイナリ文字列をサポートしていません。詳細については、 MySQL ドキュメントを参照してください。ただし、実際には、すべてのパラメータまたは戻り値の型がバイナリ文字列である場合、MySQL で正規関数が機能します。それ以外の場合は、エラーが報告されます。
- 現在、TiDB ではバイナリ文字列の使用が禁止されており、どのような状況でもエラーが報告されます。
その他の互換性
TiDB で空の文字列を置き換える動作は MySQL とは異なります。1
REGEXP_REPLACE("", "^$", "123")
例に挙げます。- MySQL は空の文字列を置き換えず、結果として
""
を返します。 - TiDB は空の文字列を置き換え、結果として
"123"
を返します。
- MySQL は空の文字列を置き換えず、結果として
TiDB でグループをキャプチャするために使用されるキーワードは、MySQL とは異なります。MySQL ではキーワードとして
$
使用されますが、TiDB ではキーワードとして\\
が使用されます。また、TiDB では0
から9
までの番号のグループのみをキャプチャできます。たとえば、次の SQL ステートメントは TiDB に
ab
返します。SELECT REGEXP_REPLACE('abcd','(.*)(.{2})$','\\1') AS s;