[MySQL] 文字列型のカラムに入った数字で MAX() する時の注意

この記事は公開されてから7年経過しています。現在とは内容が異なる場合がありますのでご注意ください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。

とある事情により、数字 or NULL だけしか入らないだろうと想定されるカラムが VARCHAR型 になっています。
この時、そのカラムに対して MAX() をした時に思わぬ数字になることがあります。

こんなデータが有るときに

とすると

本当なら 24 を期待していたところなんですが。

となります。

データの1文字目をチェックして 2 より 9 のほうが大きいからそうなったんでしょう。

なので、 MAX() するときに値を数値にキャストしてみます。

CAST関数 については CAST(キャストしたいカラム名 AS キャスト先の型) とします。
キャスト先の型については create table する時のような int とかではなく決められたものを指定します。
MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.8 キャスト関数と演算子

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

CAST関数 の代わりに CONVERT関数も使えます。

なんだかややこしいですが、最初っから INT型 のカラムにしておけば問題ありません。
今回は外部からのデータを取り込むテーブルのため、「もし万が一文字列がきたらどうしよう」という事情のため VARCHAR型 カラムにしたためこのような措置をとりました。