使用正则表达式触发验证不适用于换行符

时间:2019-01-26 15:08:24

标签: mysql

我正在尝试使用mysql-trigger验证插入。 col1中的插入只能是数字。首先,不能将col1定义为整数。但是,如果结尾有换行符,则验证失败。

在这里摆桌子

CREATE TABLE testTable(col1 varchar(20), col2 int);

这里是触发验证器

DELIMITER $$
CREATE TRIGGER check_numeric BEFORE INSERT ON testTable
FOR EACH ROW
BEGIN
IF (NEW.col1 REGEXP '^[0-9]+$') = 0 THEN
SIGNAL SQLSTATE '12345' SET MESSAGE_TEXT='non-numerical';
END IF;
END $$

如果我尝试在末尾插入包含换行符的字符串,则会通过验证,尽管我认为不应这样做,因为换行符不是数字。

INSERT INTO testTable values('323423\n', 12);

有人知道我在这里想念什么吗?

2 个答案:

答案 0 :(得分:1)

您能以这种方式检查

IF NEW.col1 REGEXP '^[0-9]+$' AND NEW.col1 NOT REGEXP '\n' THEN

with w as 
(select '1234' c1 from dual union all
 select '1234\n' from dual)
select * from w 
where c1 REGEXP '^[0-9]+$' AND c1 NOT REGEXP "\n";

结果:1234

Working Fiddle

答案 1 :(得分:1)

另一种选择是搜索不是数字的任何内容,如果任何字符不是数字,则返回1:REGEXP '[^[:digit:]]'

因此IF子句将是

IF (NEW.col1 REGEXP '[^[:digit:]]') = 1 THEN ...

如果您不想使用字符类,当然可以写[^0-9]而不是[:digit:]