Mysql 8 пользовательская строковая функция всегда возвращает ноль - PullRequest
0 голосов
/ 18 сентября 2018

Я застрял на этом некоторое время.Я написал простой UDF для slugify в MySQL8, который использует встроенную функцию 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 () назначается переменной или возвращаемому значению в пользовательской функции.

В документации не говорится, что вынельзя использовать regexp_replace в udf, так почему это возвращает 0 без каких-либо ошибок или предупреждений?

1 Ответ

0 голосов
/ 18 сентября 2018

Поскольку в некоторых комментариях указывалось, что эта функция работает правильно в dbfiddle, я начал проводить исследования версий, используемых в dbfiddle и моем собственном сервере.

Эта функция slugify отлично работает в mysql 8.0.12, но не в mysql 8.0.11. Я обнаружил 2 связанные ошибки в regexp_replace (), которые были исправлены в 8.0.12:

Я обновил свой сервер до 8.0.12 и получил работающую функцию.

...