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 插入创建了一个用户定义的函数,但它不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mysql中时间dateTime怎么插入?

怎么样将java中的date类型插入到mysql的datetime

如何向mysql数据库中插入日期

MySql要怎么插入DateTime型的数据?

mysql插入数据有(datetime类型怎么插入) 求一个完整的SQL语句

DateTime 未插入 MySql 数据库