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 … なんだこりゃ分かんねぇ…