为什么不执行严格模式?

时间:2019-10-09 20:35:43

标签: mysql

这是mysql shell的一个片段:

mysql> show variables like '%version%';
+-------------------------+--------------------------------------------------------+
| Variable_name           | Value                                                  |
+-------------------------+--------------------------------------------------------+
| innodb_version          | 5.7.27-30                                              |
| protocol_version        | 10                                                     |
| slave_type_conversions  |                                                        |
| tls_version             | TLSv1,TLSv1.1,TLSv1.2                                  |
| version                 | 5.7.27-30                                              |
| version_comment         | Percona Server (GPL), Release '30', Revision '8916819' |
| version_compile_machine | x86_64                                                 |
| version_compile_os      | debian-linux-gnu                                       |
| version_suffix          |                                                        |
+-------------------------+--------------------------------------------------------+
9 rows in set (0.01 sec)

mysql> show variables like '%strict%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_strict_mode | ON    |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> select @@sql_mode;
+-------------------+
| @@sql_mode        |
+-------------------+
| STRICT_ALL_TABLES |
+-------------------+
1 row in set (0.00 sec)

mysql> create database stricttest;
Query OK, 1 row affected (0.00 sec)

mysql> use stricttest;
Database changed
mysql> create table foo(bar timestamp not null default current_timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into foo(bar) values(null);
Query OK, 1 row affected (0.00 sec)

问题

我的印象是STRICT_ALL_TABLES应该阻止插入成功,因为timestampNOT NULL列,但效果很好。我该怎么办才能使这样的语句失败?

上下文

我最近进行了很多测试,这些测试由于时间戳列上的空插入而无法通过启动。我不知道什么是环境因素,但是办公室周围的部落知识表明sql_mode与之有关。我想使这些测试可靠地失败,以便编写它们的人进行调查并做出适当的反应。

当前,/ etc / mysql / conf.d / mysqld.cnf如下所示:

[mysqld]
general_log=0
general_log_file=/var/log/mysql/general.log

secure_file_priv=""
datadir=/var/lib/mysql

sql_mode=STRICT_ALL_TABLES
bind-address = 127.0.0.1
default_time_zone='+00:00'
ssl=0
query_cache_type=0
max_connections=511
group_concat_max_len=65536
max_allowed_packet=500M
max_allowed_packet=256000000
innodb_buffer_pool_size=12G
innodb_buffer_pool_instances=1
innodb_thread_concurrency=8
innodb_log_buffer_size=128M
innodb_log_file_size=1000M
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_autoinc_lock_mode=2
innodb_doublewrite=0
innodb_strict_mode=ON                                                                                                         

2 个答案:

答案 0 :(得分:4)

如果该列没有默认值,或者explicit_defaults_for_timestamp配置值设置为ON,则会出错。 explicit_defaults_for_timestamp控制特定于时间戳的严格性变体,默认为OFF。尽管文档尚不十分清楚,但似乎它处于关闭状态时,在默认情况下插入时间戳列的NULL将使用默认值,而不会触发任何错误。

答案 1 :(得分:0)

由于TIMESTAMP的范围,

TIMESTAMP数据类型用于包含日期和时间部分的值。 TIMESTAMP的UTC范围是'1970-01-01 00:00:01'到UTC的范围是'2038-01-19 03:14:07'。

当需要大于2038-01-19的日期存储的日期时,您已经内置了应用程序故障。

19年将不复存在。