teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

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

2017/08/09 12:00

投稿

bezeklik
bezeklik

スコア580

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 は 199500 と解釈されることになります。
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
- この仕様により、 199500 が正しくないため '0000-00-00' になる、ということですね。
33
+ この仕様により、 001995 が正しくないため '0000-00-00' になる、ということですね。

4

仕様とコメントの追記

2017/08/09 12:00

投稿

bezeklik
bezeklik

スコア580

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

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

2017/01/21 06:21

投稿

bezeklik
bezeklik

スコア580

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

明示的な解決策を追記

2017/01/21 06:14

投稿

bezeklik
bezeklik

スコア580

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  計算された値が挿入されてしまってはいないでしょうか。
2
2
 
3
+ 例えば以下のような引用符`'`が付いていないソースコードだと、
3
- 例えば以下のようなソースコードだと、`2017-01-21` が計算式として解釈されてしまい
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

微妙な間違いを修正

2017/01/21 06:00

投稿

bezeklik
bezeklik

スコア580

answer CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  ```php
8
8
  $date = date('Y-m-d');
9
- mysql_query('INSERT INTO table (datecolumn) VALUE ($date);')
9
+ mysql_query("INSERT INTO table (column) VALUE ($date);");
10
10
  ```
11
11
 
12
12
  ```sql
13
- INSERT INTO `table` (`datecolumn`) VALUES (2017 -01 -01)
13
+ INSERT INTO `table` (`column`) VALUES (2017-01-21);
14
14
  ```