我有一段时间一直在想这个。我在mysql8中编写了一个简单的slugify udf,它使用了内置的regexp\u 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\u replace函数,但效果很好,因此只有在将regexp\u replace()赋给自定义函数中的变量或返回值时才会出现问题。
文档中没有说明不能在自定义项中使用regexp\u replace,那么为什么返回0时没有任何错误或警告呢?
1条答案
按热度按时间ecbunoof1#
因为一些评论认为这个函数在dbfiddle中可以正常工作,所以我开始研究dbfiddle和我自己的服务器上使用的版本。
这个slugify函数在mysql 8.0.12中可以正常工作,但在mysql 8.0.11中不能。我发现了2个与regexp\u replace()相关的bug,它们在8.0.12中已修复:
regexp\u替换累加结果
regexp\u替换截断更新
我将服务器更新到8.0.12,并使该功能正常工作。