This setting has changed from 5.5 to 5.6, it includes
strict_trans_tables - sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES.
The default in 5.5 didn't really prohibit very much except
it gives an error if the storage engine specified for any table activity (eg.
create or alter) is unavailable. In 5.6, by default, strict mode is
enable (strict mode is enabled when either strict_all_tables or
strict_trans_tables is used). Strict mode controls how MySQL handles
input values that are invalid or missing. Strict_trans_tables gives an
error when a value is invalid or missing. In non strict mode it converts
an invalid value to the closest valid value for the column and inserts the
adjusted value. This behaviour can change depending on if the table is
transactional, but generally in strict mode an error is usually generated and
the transaction is stopped or rolled back.
Strict Mode
root [(none)]> select @@sql_mode;
+--------------------------------------------+
|
@@sql_mode
|
+--------------------------------------------+
|
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
root [(none)]> use test;
Database changed
root [test]> CREATE TABLE t (i INT NOT NULL);
Query OK, 0 rows affected (0.08 sec)
root [test]> INSERT INTO t VALUES();
ERROR 1364 (HY000): Field 'i' doesn't have a default
value
root [test]> INSERT INTO t VALUES(DEFAULT);
ERROR 1364 (HY000): Field 'i' doesn't have a default
value
root [test]> INSERT INTO t VALUES(DEFAULT(i));
ERROR 1364 (HY000): Field 'i' doesn't have a default
value
root [test]> select * from t;
Empty set (0.00 sec)
Non Strict Mode
DB1> use suetest;
Database changed
DB1> select @@sql_mode;
+------------------------+
|
@@sql_mode
|
+------------------------+
|
NO_ENGINE_SUBSTITUTION |
+------------------------+
DB1> CREATE TABLE t (i INT NOT NULL);
Query OK, 0 rows affected (4.08 sec)
DB1> INSERT INTO t VALUES();
Query OK, 1 row affected, 1 warning (0.48 sec)
DB1> INSERT INTO t VALUES(DEFAULT);
Query OK, 1 row affected, 1 warning (0.10 sec)
DB1> INSERT INTO t VALUES(DEFAULT(i));
ERROR 1364 (HY000): Field 'i' doesn't have a default value
DB1> select * from t;
+---+
| i |
+---+
| 0 |
| 0 |
+---+
2 rows in set (0.38 sec)
This setting affects data and the way it is validated.
An important question is does it have a performance impact?
B.3.6: Does strict mode impact performance? The intensive validation of input data that some settings requires more time than if the validation is not done. While the performance impact is not that great, if you do not require such validation (perhaps your application already handles all of this), then MySQL gives you the option of leaving strict mode disabled. However—if you do require it—strict mode can provide such validation.
The documentation link is:
No comments:
Post a Comment