我现在坚持了一段时间。我在 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 而没有任何错误或警告呢?