我在这个问题上停留了一段时间。我在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却没有任何错误或警告?
答案 0 :(得分:0)
由于一些评论表明该功能可以在dbfiddle中正常工作,因此我开始对dbfiddle和我自己的服务器上使用的版本进行一些研究。
此slugify函数在mysql 8.0.12中可以正常工作,但在mysql 8.0.11中则不能正常工作。我发现了两个有关regexp_replace()的错误,这些错误已在8.0.12中修复:
我将服务器更新为8.0.12,并使该功能正常工作。