MySQL 8自定义字符串函数始终返回零

时间:2018-09-18 07:24:52

标签: mysql database mysql-8.0

我在这个问题上停留了一段时间。我在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却没有任何错误或警告?

1 个答案:

答案 0 :(得分:0)

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

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

我将服务器更新为8.0.12,并使该功能正常工作。