MYSQL,为 date|datetime 插入创建了一个用户定义的函数,但它不起作用
Posted
技术标签:
【中文标题】MYSQL,为 date|datetime 插入创建了一个用户定义的函数,但它不起作用【英文标题】:MYSQL, created a user-defined-function for date|datetime inserts, but it doesn't work 【发布时间】:2019-12-11 13:51:45 【问题描述】:我构建了一个小型 mysql 用户定义函数,我认为它会在行之间复制之前对 date|datetime 值进行健全检查。
这是我想出的:
drop function safe_date;
DELIMITER $$
CREATE FUNCTION safe_date(input varchar (255))
RETURNS datetime
DETERMINISTIC
BEGIN
declare output datetime;
if ((SELECT WEEK(input) IS NOT NULL AS valid) > 0) then
set output= input;
else
set output = NULL;
END IF;
return output;
END $$
DELIMITER ;
当我测试它时它似乎工作:
mysql> select safe_date(0);
+--------------+
| safe_date(0) |
+--------------+
| NULL |
+--------------+
1 row in set (0.00 sec)
mysql> select safe_date('');
+---------------+
| safe_date('') |
+---------------+
| NULL |
+---------------+
1 row in set (0.00 sec)
mysql> select safe_date('2012-05-');
+-----------------------+
| safe_date('2012-05-') |
+-----------------------+
| NULL |
+-----------------------+
1 row in set (0.00 sec)
mysql> select safe_date('2012-05-05');
+-------------------------+
| safe_date('2012-05-05') |
+-------------------------+
| 2012-05-05 00:00:00 |
+-------------------------+
1 row in set (0.00 sec)
mysql>
但是当我尝试在插入中捕获无效的日期时间时,我得到一个错误:
mysql> show create table test;
+-------+--------------------------------
| Table | Create Table
+-------+--------------------------------
| test | CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------
1 row in set (0.00 sec)
mysql> insert into test values(1,safe_date('2012-05-05'));
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(2,safe_date('2012-05-'));
ERROR 1292 (22007): Incorrect datetime value: '2012-05-'
mysql>
谁能告诉我我绊倒了什么?
你用的是什么版本的mysql?我在 mysql 5.7 上尝试过,它可以正常工作。还有你有什么sql模式?显示会话变量,如 'sql_mode%'
这是一些系统信息:
mysql> SHOW VARIABLES like 'version';
+---------------+-----------------------------+
| Variable_name | Value |
+---------------+-----------------------------+
| version | 5.7.28-0ubuntu0.16.04.2-log |
+---------------+-----------------------------+
1 row in set (0.01 sec)
mysql> show session variables like 'sql_mode%';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
【问题讨论】:
你用的是什么版本的mysql?我在 mysql 5.7 上尝试过,它可以正常工作。还有你有什么sql模式?显示会话变量,如“sql_mode%” 嗨,我添加了对原帖的回复 我试过你的sql模式,还是可以的。我有 5.7.20 SELECT 2 AS c1, safe_date('2012-05-') AS c2 返回什么? 返回:c1 =2 c2 =NULL 【参考方案1】:重新审视这个问题后,我找到了解决方案。
它与sql_mode有关,特别是STRICT_TRANS_TABLES是我的设置中导致ERROR 1292的设置。
我将此行添加到 mysqld.cnf
[mysqld]
sql-mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
.. 这基本上是所有当前设置减去 STRICT_TRANS_TABLES
重新启动 mysqld,现在我的自定义函数可以工作了,并且可以安全重新启动。
【讨论】:
以上是关于MYSQL,为 date|datetime 插入创建了一个用户定义的函数,但它不起作用的主要内容,如果未能解决你的问题,请参考以下文章
怎么样将java中的date类型插入到mysql的datetime