日付型のフォーマットにスラッシュを使ってはいけません(文字コードによって値が変わる)

MySQLで日付型(date型)のフォーマットは『2014/07/26』のようなスラッシュではなく、『2014-07-26』のようにハイフンを使います。
スラッシュでも場合によっては動作しますが、 UTF8で指定されたテーブルをSJISなど別の言語で日付抽出するときなどに値が変わります。

場合によっては正しい値が出てしまうのが怖いところです。

[参考記事] 文字コードを指定する方法
[参考記事] PHPでMySQLの文字コードを指定する方法
[参考記事] MySQLでdatetime型(日時)を日付で抽出するSQLの速度比較

次のサンプルはUTF-8にセットされたテーブルでの例です。
『2014-01-01』以降の日付抽出で217件のレコードが抽出されます。

mysql> SELECT count(*) FROM `sample_table` WHERE `sample_time` >= '2014-01-01';
+----------+
| count(*) |
+----------+
|      217 |
+----------+
1 row in set (0.00 sec)

これをShift-JISに指定します。

mysql> set names sjis;
Query OK, 0 rows affected (0.00 sec)

同じように『2014-01-01』以降の日付抽出で217件のレコードが抽出されます。

mysql> SELECT count(*) FROM `sample_table` WHERE `sample_time` >= '2014-01-01';
+----------+
| count(*) |
+----------+
|      217 |
+----------+
1 row in set (0.00 sec)

ところが『2014/01/01』のように指定すると0件になります。
条件によっては異なる件数が抽出されるようです。
ここでの文字セットはShift-JISのままです。

mysql> SELECT count(*) FROM `sample_table` WHERE `sample_time` >= '2014/01/01';
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

これをUTF-8に指定してみると。

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

『2014/01/01』のように指定しても正しい値が返ります。

mysql> SELECT count(*) FROM `sample_table` WHERE `sample_time` >= '2014/01/01';
+----------+
| count(*) |
+----------+
|      217 |
+----------+
1 row in set (0.00 sec)

正しい書き方をしないと日付型も文字コードに依存します。

ちなみにdatetime型を『2014-07-26』のように単純に比較すると『00:00:00』が補完されます。

`sample_time` = '2014-07-26'
   ↓と同じ扱い
`sample_time` = '2014-07-26 00:00:00'

スポンサーリンク

関連記事

スポンサーリンク

OpenTypeフォントを用いて2バイト文字を表示することができない

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る