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

Mysql 使用正则表达式的触发器验证不适用于换行符,mysql,Mysql,我正在尝试使用mysql触发器验证插入。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

我正在尝试使用mysql触发器验证插入。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);

有人知道我遗漏了什么吗?

你能用这种方法检查一下吗

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

结果:1234


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

因此,
IF
子句是

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

当然,如果您不想在MySQL 5.7.24上使用字符类

,您可以编写
[^0-9]
而不是
[:digit:][/code>,至少如果我对该regexp检查“1234\n”,我会得到0的结果。我没有将其作为触发器进行检查,但我认为它会以同样的方式工作。看起来很奇怪。令人惊讶的是,这对我来说很有效。尽管如此,我并不完全理解为什么相反的方法会失败。非常感谢。
IF (NEW.col1 REGEXP '[^[:digit:]]') = 1 THEN ...