Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

技術情報

DBでソートの対象となるカラムはデータ型に注意すべき

投稿日:


当たり前なんだけど、意外とハマる可能性がある気がするのでメモ。
例えば、以下のようなテーブル(test)があるとします。

id name
1 太郎
2 次郎
3 三郎
10 花子
11 良子

で、以下のようなSQLを実行した場合に、

SELECT id FROM test ORDER BY id;

結果が、必ずしも「1, 2, 3, 10, 11」の順にならない場合があります(!)
それは、idのデータ型が文字列型(textとかvarcharとか)の時です。
文字列型のカラムにソートをかけた場合、文字列の1文字目から順に大小を比較していきます。
なので、結果としては「1, 10, 11, 2, 3」の順になります。
また、同じテーブルでMAX関数を使った場合、

SELECT MAX(id) FROM test;

その結果が「11」にならず「3」になる事も同様の理由です。
ね?結構しでかしちゃいそうでしょ?


さて、上記ふまえてソートに使われそうなカラムにどのデータ型を使ったらいいか考えてみる。

普通に数値型(integerとか)でいいんじゃないか?

PrimaryKeyとかIDになりそうなユニークなカラムは数値型でいいと思う。桁が変わる事があるのでちょっと気持ち悪い気がするけど。

文字列型(textとかvarcharとか)を使う場合

間違っても文字列型の中に、数字っぽい値をいれてはいけない。
理由は冒頭で説明した通り、ソートしたりMAX値を取得した時に思った値が返ってこないから。
で、良くありそうなのが接頭字を付けるパターン。
「id001」とか「N0001」みたいな。
この場合気を付けなきゃいけないのは必ず桁を「0」で埋めて固定長にする事。
「id98, id99, id100」をソートすると「id100, id98, id99」になっちゃうから。
「id098, id099, id100」 であれば思った通りの順番になる。
あとは、固定長といっても接頭字なしで「0」埋めしても良くない事が起こるかも。
「00001」「00002」「000003」・・・
なぜかというと、思わぬところで数値型に変換されちゃうかもしれないから。(JSとかで)
つまり、「”00001″」だったものがいつのまにか「1」になっちゃう事があるから。(詳細省略)

まとめ

スミマセン、まとまりませんでした。
ネタ的には完全に出オチでしたね。冒頭部分だけ見て下さい 🙁

-技術情報

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

「パケ・ホーダイ」にして使い倒したい携帯サイト

先月、貧乏家族のもとに悲しいお知らせが届きました。 オ、オレの携帯代が1万円超えとるやないか! 電話キライ、メールは相方としかやらないオレは超ライトユーザだったはずが何で?・・・って、実は理由は分かっ …

Apple Outlet をバージョンアップ。クリスマスギフトに整備済Mac, iPodはどうですか?

以前にApple Store の特別限定販売ページのお得な商品をチェックするサービスを作って公開していました。 ・Apple Store のアウトレット品が買える「特別限定販売」ページをいち早くチェッ …

MacBookのメモリを4GBに増設

先日、開発環境構築の手順を公開しましたが、ローカルサーバとしての使い方とは別に、VMを立ち上げたり、最近PHP開発に使えそうか試しているeclipseを起動していたり、はたまた動画を見たりしてマシンを …

クラリオンのカーナビ「Smoonavi」を体験するブロガーイベントに参加しました

みんぽす経由でクラリオンのカーナビを体験できるブロガーイベントに参加させていただきました。 とてもキレイなオフィスビルは、埼玉スーパーアリーナのすぐ裏にあるクラリオンの技術センターです。 それではさっ …

no image

今度は AirMac Express がお亡くなりになって、FONに苦戦中(泣

少し前から、MacBookを始め身の回りの機器が軒並み調子が悪い状態です。 んで、今度は無線LANルーターとして使っているAirMac Expressの電源が入らなくなっちゃいました>< 3年以上は使 …

スポンサードリンク

スポンサードリンク