MariaDB неверный синтаксис рядом с '' - PullRequest
0 голосов
/ 25 апреля 2018

, как говорится в заголовке, у меня есть ошибка с моим синтаксисом где-то. Это MariaDB 10.1.31.

DROP FUNCTION IF EXISTS NO_UMLAUT;
CREATE FUNCTION NO_UMLAUT(TextString VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    SET TextString = REPLACE(TextString, 'ä', 'a');
    SET TextString = REPLACE(TextString, 'ë', 'e');
    SET TextString = REPLACE(TextString, 'ḧ', 'h');
    SET TextString = REPLACE(TextString, 'n̈', 'n');
    SET TextString = REPLACE(TextString, 'ï', 'i');
    SET TextString = REPLACE(TextString, 'ẗ', 't');
    SET TextString = REPLACE(TextString, 'ö', 'o');
    SET TextString = REPLACE(TextString, 'ẅ', 'w');
    SET TextString = REPLACE(TextString, 'ß', 'b');
    SET TextString = REPLACE(TextString, 'ü', 'u');
    SET TextString = REPLACE(TextString, 'ẍ', 'x');
    SET TextString = REPLACE(TextString, 'ÿ', 'y');
    RETURN TextString;
END;

и ошибка:

 You have an error in your SQL syntax;
 check the manual that corresponds to your MariaDB server version
 for the right syntax to use near '' at line 3.

Пока что я попробовал функцию из документации, и там также была ошибка с синтаксисом. Я выполняю этот запрос в HeidiSQL 9.5.0.5196.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Рабочее решение:

DROP FUNCTION IF EXISTS NO_UMLAUT;

DELIMITER //
CREATE FUNCTION NO_UMLAUT(TextString VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    SET TextString = REPLACE(TextString, 'ä', 'a');
    SET TextString = REPLACE(TextString, 'ë', 'e');
    SET TextString = REPLACE(TextString, 'ḧ', 'h');
    SET TextString = REPLACE(TextString, 'n̈', 'n');
    SET TextString = REPLACE(TextString, 'ï', 'i');
    SET TextString = REPLACE(TextString, 'ẗ', 't');
    SET TextString = REPLACE(TextString, 'ö', 'o');
    SET TextString = REPLACE(TextString, 'ẅ', 'w');
    SET TextString = REPLACE(TextString, 'ß', 'b');
    SET TextString = REPLACE(TextString, 'ü', 'u');
    SET TextString = REPLACE(TextString, 'ẍ', 'x');
    SET TextString = REPLACE(TextString, 'ÿ', 'y');
    RETURN TextString;
END;
//

PS Я бы рекомендовал избегать использования функций, так как это резко снижает производительность базы данных.Если ваша цель - производительность, то было бы лучше выполнить денормализацию вашей базы данных, создав дополнительные поля с уже удаленными значениями umlauts.

Было бы также лучше удалитьУмлауты в вашей программе вместо использования функции mysql в качестве юникода могут быть очень хитрыми, и умлауты могут быть созданы с использованием разных подходов.Я надеюсь, что вы не доверяете входящим данным из внешних источников, вы тщательно их дезинфицируете, и ваш юникод уже был нормализован до того, как был помещен в базу данных (если нет - сделайте это!).

0 голосов
/ 25 апреля 2018

Я думаю, вам просто нужны DELIMITER операторы.

С самой функцией все в порядке, как показано этим SQL Fiddle (MariaDB и MySQL для этой цели одинаковы).

Попробуйте добавить:

 DELIMITER $$

 <your function definition>

 DELIMITER ;
...