IT

MySQL 文字列を数値に変換するにはどうするんだったっけ?

さて問題です、MySQLの文字列型(VARCHAR)に格納されている値を数値に変換するにはどうしますか?

CASTとかCONVERTとか使って数値型に変換できたよね

はい正解です。

SELECT CAST('123' AS SIGNED)

このようにCASTを使って数値型(SIGNEDは符号付き64 ビット整数)に変換できます。
この場合は、 ‘123’ という文字列 が 123 という数値に変換されます。CONVERTも構文が多少違いますが同じ役割です。

では次の問題です。数値型に変換できない文字をCASTで数値型に変換するとどうなるでしょう?

変換できないのならエラーになるんじゃね

不正解。
数値型に変換できなければ 0 に変換されます。

SELECT CAST('abc' AS SIGNED) -- 0

この場合、’abc’ は数値と解釈できないので 0 になります。

次の問題です。では ‘abc12′ , ’34abc’ , ’12abc34′ をCASTで数値型に変換するとそれぞれどうなるでしょう?

むむっ、数字と文字が混ざってる..変換できないからどれもさっき言ってた 0 になるかな

不正解。

SELECT CAST('abc12' AS SIGNED) -- 0
SELECT CAST('34abc' AS SIGNED) -- 34
SELECT CAST('12abc34' AS SIGNED) -- 12

となります。先頭から数値として有効な部分だけ取り出している感じですね。

’12abc34′ が 12 は受け入れがたい仕様だ💢

たしかにこの動作だと困ることもありますね。では、例えば「数値に変換できない文字が含まれていたら強制的に 0 」としたいなら、次のように正規表現で文字列が数値だけなのかを判定してCASTする方法も考えられます。

SELECT CASE WHEN '12abc34' REGEXP '^[0-9]+$' THEN CAST( '12abc34' AS SIGNED ) ELSE 0 END

パフォーマンスが犠牲になってないか注意してくださいね。

CASE に REGEXP … なんだこりゃ分かんねぇ…

 

  • ABOUT ME
    tubogo
    自己紹介:SE歴17年、儲からない事ならいろいろかじってます。