回答編集履歴
5
文字列解釈時のゼロ埋めが「先行ゼロ」と記載があるため解釈に誤謬があったので修正
answer
CHANGED
@@ -24,10 +24,10 @@
|
|
24
24
|
|
25
25
|
> 数値として指定する値は、6、8、12、14 のいずれかの桁数にするようにしてください。数値を 8 桁または 14 桁の長さにすると、YYYYMMDD または YYYYMMDDHHMMSS 形式であり、最初の 4 桁が年であると想定されます。数値を 6 桁または 12 桁の長さにすると、YYMMDD または YYMMDDHHMMSS 形式であり、最初の 2 桁が年であると想定されます。これらの長さではない数字は、いちばん近い長さまで先行ゼロで埋められているかのように解釈されます。
|
26
26
|
|
27
|
-
この仕様により 1995 は
|
27
|
+
この仕様により 1995 は 001995 と解釈されることになります。
|
28
28
|
|
29
29
|
> 日時コンテキストでの文字列リテラルと数値リテラル MySQL は次の形式で DATE 値を認識します。
|
30
30
|
> (snip)
|
31
31
|
> 'YYYYMMDD' または 'YYMMDD' 形式の、区切り文字がない文字列 (日付として適切なもの) として。たとえば、'20070523' と '070523' は '2007-05-23' として解釈されますが、'071332' は正しくないため (月と日の部分が不適切)、'0000-00-00' になります。
|
32
32
|
|
33
|
-
この仕様により、
|
33
|
+
この仕様により、 001995 が正しくないため '0000-00-00' になる、ということですね。
|
4
仕様とコメントの追記
answer
CHANGED
@@ -24,3 +24,10 @@
|
|
24
24
|
|
25
25
|
> 数値として指定する値は、6、8、12、14 のいずれかの桁数にするようにしてください。数値を 8 桁または 14 桁の長さにすると、YYYYMMDD または YYYYMMDDHHMMSS 形式であり、最初の 4 桁が年であると想定されます。数値を 6 桁または 12 桁の長さにすると、YYMMDD または YYMMDDHHMMSS 形式であり、最初の 2 桁が年であると想定されます。これらの長さではない数字は、いちばん近い長さまで先行ゼロで埋められているかのように解釈されます。
|
26
26
|
|
27
|
+
この仕様により 1995 は 199500 と解釈されることになります。
|
28
|
+
|
29
|
+
> 日時コンテキストでの文字列リテラルと数値リテラル MySQL は次の形式で DATE 値を認識します。
|
30
|
+
> (snip)
|
31
|
+
> 'YYYYMMDD' または 'YYMMDD' 形式の、区切り文字がない文字列 (日付として適切なもの) として。たとえば、'20070523' と '070523' は '2007-05-23' として解釈されますが、'071332' は正しくないため (月と日の部分が不適切)、'0000-00-00' になります。
|
32
|
+
|
33
|
+
この仕様により、 199500 が正しくないため '0000-00-00' になる、ということですね。
|
3
リファレンスのリンクと引用を追記
answer
CHANGED
@@ -19,3 +19,8 @@
|
|
19
19
|
$date = date('Y-m-d');
|
20
20
|
mysql_query("INSERT INTO table (column) VALUE ('$date');");
|
21
21
|
```
|
22
|
+
|
23
|
+
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.1.3 日付リテラルと時間リテラル](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-literals.html)
|
24
|
+
|
25
|
+
> 数値として指定する値は、6、8、12、14 のいずれかの桁数にするようにしてください。数値を 8 桁または 14 桁の長さにすると、YYYYMMDD または YYYYMMDDHHMMSS 形式であり、最初の 4 桁が年であると想定されます。数値を 6 桁または 12 桁の長さにすると、YYMMDD または YYMMDDHHMMSS 形式であり、最初の 2 桁が年であると想定されます。これらの長さではない数字は、いちばん近い長さまで先行ゼロで埋められているかのように解釈されます。
|
26
|
+
|
2
明示的な解決策を追記
answer
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
計算された値が挿入されてしまってはいないでしょうか。
|
2
2
|
|
3
|
+
例えば以下のような引用符`'`が付いていないソースコードだと、
|
3
|
-
|
4
|
+
`2017-01-21` が計算式として解釈されてしまい
|
4
5
|
実際には 1995 という整数が挿入されてしまいます。
|
5
6
|
その結果、日付としては 0000-00-00 になってしまうというわけです。
|
6
7
|
|
@@ -11,4 +12,10 @@
|
|
11
12
|
|
12
13
|
```sql
|
13
14
|
INSERT INTO `table` (`column`) VALUES (2017-01-21);
|
14
|
-
```
|
15
|
+
```
|
16
|
+
|
17
|
+
以下のように引用符で囲ってやれば解決するはずです。
|
18
|
+
```php
|
19
|
+
$date = date('Y-m-d');
|
20
|
+
mysql_query("INSERT INTO table (column) VALUE ('$date');");
|
21
|
+
```
|
1
微妙な間違いを修正
answer
CHANGED
@@ -6,9 +6,9 @@
|
|
6
6
|
|
7
7
|
```php
|
8
8
|
$date = date('Y-m-d');
|
9
|
-
mysql_query(
|
9
|
+
mysql_query("INSERT INTO table (column) VALUE ($date);");
|
10
10
|
```
|
11
11
|
|
12
12
|
```sql
|
13
|
-
INSERT INTO `table` (`
|
13
|
+
INSERT INTO `table` (`column`) VALUES (2017-01-21);
|
14
14
|
```
|