回答編集履歴

5

文字列解釈時のゼロ埋めが「先行ゼロ」と記載があるため解釈に誤謬があったので修正

2017/08/09 12:00

投稿

bezeklik
bezeklik

スコア580

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- この仕様により 1995 は 199500 と解釈されることになります。
53
+ この仕様により 1995 は 001995 と解釈されることになります。
54
54
 
55
55
 
56
56
 
@@ -62,4 +62,4 @@
62
62
 
63
63
 
64
64
 
65
- この仕様により、 199500 が正しくないため '0000-00-00' になる、ということですね。
65
+ この仕様により、 001995 が正しくないため '0000-00-00' になる、ということですね。

4

仕様とコメントの追記

2017/08/09 12:00

投稿

bezeklik
bezeklik

スコア580

test CHANGED
@@ -50,4 +50,16 @@
50
50
 
51
51
 
52
52
 
53
+ この仕様により 1995 は 199500 と解釈されることになります。
53
54
 
55
+
56
+
57
+ > 日時コンテキストでの文字列リテラルと数値リテラル MySQL は次の形式で DATE 値を認識します。
58
+
59
+ > (snip)
60
+
61
+ > 'YYYYMMDD' または 'YYMMDD' 形式の、区切り文字がない文字列 (日付として適切なもの) として。たとえば、'20070523' と '070523' は '2007-05-23' として解釈されますが、'071332' は正しくないため (月と日の部分が不適切)、'0000-00-00' になります。
62
+
63
+
64
+
65
+ この仕様により、 199500 が正しくないため '0000-00-00' になる、ということですね。

3

リファレンスのリンクと引用を追記

2017/01/21 06:21

投稿

bezeklik
bezeklik

スコア580

test CHANGED
@@ -41,3 +41,13 @@
41
41
  ```
42
42
 
43
43
 
44
+
45
+ [MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.1.3 日付リテラルと時間リテラル](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-literals.html)
46
+
47
+
48
+
49
+ > 数値として指定する値は、6、8、12、14 のいずれかの桁数にするようにしてください。数値を 8 桁または 14 桁の長さにすると、YYYYMMDD または YYYYMMDDHHMMSS 形式であり、最初の 4 桁が年であると想定されます。数値を 6 桁または 12 桁の長さにすると、YYMMDD または YYMMDDHHMMSS 形式であり、最初の 2 桁が年であると想定されます。これらの長さではない数字は、いちばん近い長さまで先行ゼロで埋められているかのように解釈されます。
50
+
51
+
52
+
53
+

2

明示的な解決策を追記

2017/01/21 06:14

投稿

bezeklik
bezeklik

スコア580

test CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
 
4
4
 
5
+ 例えば以下のような引用符`'`が付いていないソースコードだと、
6
+
5
- 例えば以下のようなソースコードだと、`2017-01-21` が計算式として解釈されてしまい
7
+ `2017-01-21` が計算式として解釈されてしまい
6
8
 
7
9
  実際には 1995 という整数が挿入されてしまいます。
8
10
 
@@ -25,3 +27,17 @@
25
27
  INSERT INTO `table` (`column`) VALUES (2017-01-21);
26
28
 
27
29
  ```
30
+
31
+
32
+
33
+ 以下のように引用符で囲ってやれば解決するはずです。
34
+
35
+ ```php
36
+
37
+ $date = date('Y-m-d');
38
+
39
+ mysql_query("INSERT INTO table (column) VALUE ('$date');");
40
+
41
+ ```
42
+
43
+

1

微妙な間違いを修正

2017/01/21 06:00

投稿

bezeklik
bezeklik

スコア580

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  $date = date('Y-m-d');
16
16
 
17
- mysql_query('INSERT INTO table (datecolumn) VALUE ($date);')
17
+ mysql_query("INSERT INTO table (column) VALUE ($date);");
18
18
 
19
19
  ```
20
20
 
@@ -22,6 +22,6 @@
22
22
 
23
23
  ```sql
24
24
 
25
- INSERT INTO `table` (`datecolumn`) VALUES (2017 -01 -01)
25
+ INSERT INTO `table` (`column`) VALUES (2017-01-21);
26
26
 
27
27
  ```