Edited at

MySQL常用文字列操作関数

More than 1 year has passed since last update.

以下、動作環境はWindows版MySQL Community Server 5.7.16です。


文字列の長さ

lengthとoctet_lengthとchar_lengthがあります。octet_lengthはlengthと同じです。

lengthはバイト単位の長さ、char_lengthは字数単位の長さです。文字列中にマルチバイト文字が含まれていると、結果に差が現れます。length(NULL)やchar_length(NULL)はNULLです。

select length('1234567890');

10

select char_length('1234567890');
10

select length('1234567890');
30

select char_length('1234567890');
10

select length(null);
NULL

select char_length(null);
NULL


部分文字列(左端・右端)

left(str, len)で、文字列strの左端len文字を切り取ります。バイト数ではなく字数です。len>length(str)の場合は、文字列全体を返します。len<0の場合は、空白文字列''を返します。str, lenのどちらかがNULLなら、戻り値もNULLです。right(str, len)は右端を切り取ります。

select left('1234567890', 5);

12345

select left('1234567890', 5);
12345

select left('1234567890', 1);
1

select left('1234567890', 0);

select left('1234567890', -1);

select left('1234567890', 11);
1234567890

select left(null, 1);
NULL

select left('1234567890', null);
NULL

select right('1234567890', 5);
67890

select right('1234567890', 5);
67890

select right('1234567890', 1);
0

select right('1234567890', 0);

select right('1234567890', -1);

select right('1234567890', 11);
1234567890

select right(null, 1);
NULL

select right('1234567890', null);
NULL


部分文字列(中間)

midとsubstrとsubstringがありますが、意味は全部同じです。

mid(str, pos, len)は、文字列strの位置posから始まる長さlenの文字列を返します。posは0ではなく1から始まります。最左端位置が1です。pos, lenはバイト数ではなく字数です。lenは省略することもでき、その場合は最右端までとなります。

select mid('1234567890', 2, 1);

2

select mid('1234567890', 2);
234567890

select mid('1234567890', 2, 1);


文字列内検索

instrとlocationとpositionがあります。instrとlocationは引数の並びが逆なので注意して下さい。positionはlocationと同じです。

instr(str, substr)で、str内で最初にsubstrが現れる位置を返します。位置は0でなく1から始まります。最左端位置が1です。substrが見つからない場合は0が返ります。検索は大文字小文字を区別しません。全角文字も、全角文字同士なら大文字と小文字を区別しません。つまりは同じ文字とみなされるということです。ただし、全角と半角は区別します。つまりAは別の文字です。

select instr('ABCDEFGHIJ', 'b');

2

select instr('ABCDEFGHIJ', 'z');
0

select instr('ABCDEFGHIJ', 'A');
0

select instr('ABCDEFGHIJ', 'a');
1

select instr('あいうえおかきくけこ', 'イ');
0


置換

replace(str, from_str, to_str)で、str中に現れる部分文字列from_strを全部to_strに置き換えます。このとき、大文字と小文字を区別します。また、半角文字と全角文字も区別します。

select replace('ABCDEFGHIJ', 'A', '*');

*BCDEFGHIJ

select replace('ABCDEFGHIJ', 'a', '*');
ABCDEFGHIJ

select replace('ABCDEFGHIJ', 'A', '*');
ABCDEFGHIJ


Q&A

Q. 文字列str内で部分文字列substrが「最後」に現れる位置を返す関数はないのか。

A. ないみたいです。MS AccessにはInStrRevってのがありますが、MySQLにはありません。

以上!このぐらい頭に入っていれば取りあえず恰好はつくかな。


参考文献

MySQL 5.6 リファレンスマニュアル/関数と演算子/文字列関数

https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html