我现在已经坚持了一段时间。我在MySQL8中编写了一个简单的slugify UDF,它使用了内置的regexp_replace()函数。
函数的语法有效,但对于每个输入,它总是返回0(零)。
DELIMITER $$
CREATE FUNCTION `slugify`(dirty_string varchar(200)) RETURNS varchar(200) CHARSET utf8mb4
DETERMINISTIC
BEGIN
DECLARE slug varchar(200);
SET slug = REGEXP_REPLACE(LOWER(dirty_string), '[éèêë€]','e');
SET slug = REGEXP_REPLACE(slug, '[áàâä@]','a');
SET slug = REGEXP_REPLACE(slug, '[îï]','i');
SET slug = REGEXP_REPLACE(slug, '[üµù]','u');
SET slug = REGEXP_REPLACE(slug, '[öôØøº]','o');
SET slug = REGEXP_REPLACE(slug, '[ç]','c');
SET slug = REGEXP_REPLACE(slug, '[^a-z0-9\-]+','-');
RETURN slug;
END $$
DELIMITER ;
我首先怀疑可能导致问题的特殊字符,但简化功能会产生相同的结果:
DELIMITER $$
CREATE FUNCTION `slugify`(dirty_string varchar(200)) RETURNS varchar(200) CHARSET utf8mb4
DETERMINISTIC
BEGIN
DECLARE slug varchar(200);
SET slug = REGEXP_REPLACE(LOWER(dirty_string), 'x','a');
RETURN slug;
END $$
DELIMITER ;
为了验证语法,我试图用字符串替换regexp_replace函数,并且工作正常,所以只有在自定义函数中将regexp_replace()分配给变量或返回值时才会出现问题。
文档没有说你不能在udf中使用regexp_replace,为什么这个返回0没有任何错误或警告?
由于一些评论表明这个函数在dbfiddle中正常工作,我开始对dbfiddle和我自己的服务器上使用的版本进行一些研究。
这个slugify函数在mysql 8.0.12中工作正常,但在mysql 8.0.11中没有。我在8.0.12中找到了2个关于regexp_replace()的相关错误:
我将我的服务器更新到8.0.12并使该功能正常工作。