1

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

4

1 回答 1

0

由于一些评论表明此功能在 dbfiddle 中可以正常工作,因此我开始对 dbfiddle 和我自己的服务器上使用的版本进行一些研究。

这个 slugify 函数在 mysql 8.0.12 中可以正常工作,但在 mysql 8.0.11 中不能。我发现了 2 个有关 regexp_replace() 的相关错误,这些错误已在 8.0.12 中修复:

我将我的服务器更新到 8.0.12 并让该功能正常工作。

于 2018-09-18T13:45:40.217 回答