mysql 8自定义字符串函数总是返回零

bcs8qyzn  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(386)

我有一段时间一直在想这个。我在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时没有任何错误或警告呢?

ecbunoof

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,并使该功能正常工作。

相关问题