この記事は公開されてから8年経過しています。現在とは内容が異なる場合がありますのでご注意ください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
とある事情により、数字 or NULL だけしか入らないだろうと想定されるカラムが VARCHAR型 になっています。
この時、そのカラムに対して MAX() をした時に思わぬ数字になることがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
+-------+ | value | +-------+ | 14 | | NULL | | 10 | | NULL | | 13 | | 15 | | NULL | | 12 | | NULL | | 9 | | 24 | | NULL | | 7 | +-------+ |
こんなデータが有るときに
1 |
mysql> SELECT MAX(`value`) FROM tbl_hoge; |
とすると
本当なら 24
を期待していたところなんですが。
1 2 3 4 5 |
+--------------+ | MAX(`value`) | +--------------+ | 9 | +--------------+ |
となります。
データの1文字目をチェックして 2 より 9 のほうが大きいからそうなったんでしょう。
なので、 MAX() するときに値を数値にキャストしてみます。
1 2 3 4 5 6 7 |
mysql> SELECT MAX(CAST(`value` AS SIGNED)) FROM tbl_hoge; +------------------------------+ | MAX(CAST(`value` AS SIGNED)) | +------------------------------+ | 24 | +------------------------------+ |
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関数も使えます。
1 2 3 4 5 6 7 |
mysql> SELECT MAX(CONVERT(`value`, SIGNED)) FROM tbl_hoge; +-------------------------------+ | MAX(CONVERT(`value`, SIGNED)) | +-------------------------------+ | 24 | +-------------------------------+ |
なんだかややこしいですが、最初っから INT型 のカラムにしておけば問題ありません。
今回は外部からのデータを取り込むテーブルのため、「もし万が一文字列がきたらどうしよう」という事情のため VARCHAR型 カラムにしたためこのような措置をとりました。