以下、動作環境は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);
2
#文字列内検索
instrとlocationとpositionがあります。instrとlocationは引数の並びが逆なので注意して下さい。positionはlocationと同じです。
instr(str, substr)で、str内で最初にsubstrが現れる位置を返します。位置は0でなく1から始まります。最左端位置が1です。substrが見つからない場合は0が返ります。検索は大文字小文字を区別しません。全角文字も、全角文字同士なら大文字と小文字を区別しません。つまりA
とa
は同じ文字とみなされるということです。ただし、全角と半角は区別します。つまりA
と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