这是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
应该阻止插入成功,因为timestamp
是NOT 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
答案 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年将不复存在。