sql >> データベース >  >> RDS >> Mysql

MySQLはDATETIMEに挿入します:ISO ::8601形式を使用しても安全ですか?

    この質問に対する簡単な答えは「いいえ、安全ではありません」のようです。この結論は、MySQLシェルを使用した一連の実験に続くものです。それでも、もっと「理論的な」答えをいただければ幸いです...

    どうやらMySQLエンジンは、sql_modeを使用しても、(デフォルトで)日時リテラルとして受け入れるものがかなり自由です。 STRICT_ALL_TABLESに設定:さまざまなセパレーターが受け入れられるだけでなく、それらも異なる場合があります:

    INSERT INTO t(dt) VALUES('2012-01,03.04:[email protected]'); -- Query OK, 1 row affected

    さらに、文字列が短すぎると、ゼロが埋め込まれます...しかし、驚くかもしれません:

    INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what's inserted

    悲しいことに、文字列が長すぎると(最後の解析可能な数字の後に空白以外のものが続く場合)、厳密モードでは無効な値と見なされます。

    mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
    ERROR 1292 (22007): Incorrect datetime value: '2012-06-27T05:25Z' for column 'dt' at row 1
    mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25');
    Query OK, 1 row affected (0.10 sec)
    

    従来のモードでは、解析はさらにリラックスしますが、より正確ではありません。さらに、strictモードで正しくないと見なされる文字列は、操作は成功しますが、一種の「サイレント警告」を出します。

    mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
    Query OK, 1 row affected, 1 warning (0.10 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+---------------------------------------------+
    | Warning | 1264 | Out of range value for column 'dt' at row 1 |
    +---------+------+---------------------------------------------+
    
    mysql> SELECT dt FROM t;
    +---------------------+
    | dt                  |
    +---------------------+
    | 2012-06-27 05:25:00 |
    +---------------------+
    

    つまり、日付(および日時)が常に「正規化された」形式でDBに送信されるように、DAL関連のコードを書き直す必要がありました。 Zend_Db開発者ではなく、なぜそれをしなければならないのは私たちなのだろうか。しかし、それは別の話だと思います。 )



    1. 自分で素晴らしいリストを作成するか、ノートブックとしてGitHubを作成する

    2. djangoのデータベースエンジンとしてのpostgresとpostgresql_psycopg2の違いは何ですか?

    3. MySQL FLOOR()関数–最も近い整数に切り捨て

    4. MySQLでCoalesceを使用する方法