MariaDB 10.11触发NaN值

cgfeq70w  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(73)

我有一个表,其中包含一个float列(NULL -> Yes,默认值为NULL),用于表示:

CREATE TABLE `test` (
  `test` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

字符串
在Mysql 5上-> INSERT INTO test VALUES ('')是可以的。
On MariaDB 10 -> INSERT INTO test VALUES ('') gives me #1366 - Incorrect double value:'' for column nico. test . test at row 1
我想在插入之前做一个触发器来检测NaN值,并将其替换为NULL或0。
我测试过

DELIMITER //
CREATE TRIGGER test_vide BEFORE INSERT ON test
FOR EACH ROW
BEGIN
 IF NEW.test='' THEN
    SET NEW.test=NULL;
 END IF;
END; //
DELIMITER ;


DELIMITER //
CREATE TRIGGER test_vide BEFORE INSERT ON test
FOR EACH ROW
BEGIN
 IF NEW.test='' THEN
    SET NEW.test='0';
 END IF;
END; //
DELIMITER ;


但是它不起作用,我总是在MariaDB 10中插入错误。
有什么建议吗?
先谢了。

w8rqjzmb

w8rqjzmb1#

一种解决方案是禁用mariaDB严格模式(语法取决于您的操作系统)
我让

sql_mode = "NO_ENGINE_SUBSTITUTION"

字符串
在/etc/mysql/mariadb.conf.d/50-server.cnf我的debian 12服务器上。可以插入使用

INSERT INTO test VALUES ('')


但这并没有回答在这种情况下如何使用触发器的问题
谢谢...

pobjuy32

pobjuy322#

虽然删除所有sql_mode可以允许插入发生,但只有STRICT_TRANS_TABLE SQL_MODE需要删除以恢复以前的行为:

MariaDB [test]> set statement SQL_MODE = REPLACE(@@SQL_MODE, 'STRICT_TRANS_TABLES', '') for INSERT INTO test VALUES ('');
Query OK, 1 row affected, 1 warning (0.001 sec)

MariaDB [test]> show warnings;
+---------+------+---------------------------------------------------------------------+
| Level   | Code | Message                                                             |
+---------+------+---------------------------------------------------------------------+
| Warning | 1366 | Incorrect double value: '' for column `test`.`test`.`test` at row 1 |
+---------+------+---------------------------------------------------------------------+
1 row in set (0.000 sec)

MariaDB [test]> select * from test;
+------+
| test |
+------+
|    0 |
+------+
1 row in set (0.001 sec)

字符串

相关问题