Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL masukkan ke DATETIME:apakah aman menggunakan format ISO::8601?

Sepertinya jawaban singkat untuk pertanyaan ini adalah "Tidak, ini tidak aman" - kesimpulan ini mengikuti serangkaian percobaan dengan shell MySQL. Masih akan menghargai jawaban yang lebih "teoretis", meskipun...

Rupanya mesin MySQL (secara default) cukup liberal dalam apa yang diterimanya sebagai literal Datetime bahkan dengan sql_mode set ke STRICT_ALL_TABLES :tidak hanya berbagai pemisah yang diterima, mereka mungkin juga berbeda:

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

Selain itu, jika string terlalu pendek, itu akan diisi dengan nol... tapi mungkin ada kejutan:

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

Yang menyedihkan adalah string yang terlalu panjang (ketika digit terakhir yang dapat diuraikan diikuti oleh sesuatu selain spasi) akan dianggap sebagai nilai yang tidak valid dalam mode ketat:

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)

Dalam penguraian mode tradisional bahkan lebih santai - tetapi tidak lebih tepat; selain itu, string yang dianggap salah dalam mode ketat akan memberikan semacam 'peringatan diam', meskipun operasi akan berhasil:

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 |
+---------------------+

Intinya adalah bahwa kami harus menulis ulang beberapa kode terkait DAL sehingga tanggal (dan waktu tanggal) selalu dikirim ke DB dalam bentuk "dinormalisasi". Saya bertanya-tanya mengapa kita yang harus melakukannya, dan bukan pengembang Zend_Db. Tapi itu cerita lain, kurasa. )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah MySQL Connector/J buffer baris saat streaming ResultSet?

  2. Kesalahan MySQL::'Akses ditolak untuk pengguna 'root'@'localhost'

  3. PHP / MYSQL Tambahkan tombol ke kolom

  4. Masalah UTF-8 PHP/MySQL

  5. Terjebak dalam kesalahan 2 dengan mysql menggunakan XAMPP