MariaDB неверный синтаксис рядом с ''
Как говорится в названии, у меня есть ошибка с моим синтаксисом где-то. Это 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 ответа
Я думаю тебе просто нужно DELIMITER
заявления.
Сама функция в порядке, как показано в этой скрипте SQL (MariaDB и MySQL для этой цели одинаковы).
Попробуйте добавить:
DELIMITER $$
<your function definition>
DELIMITER ;
Рабочий раствор:
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 Я бы рекомендовал избегать использования функций, так как это резко снижает производительность базы данных. Если ваша цель - производительность, то было бы лучше выполнить денормализацию вашей базы данных, создав дополнительные поля с уже удаленными значениями.
Также было бы лучше удалить умлауты в вашей программе вместо использования функции mysql, так как юникод может быть очень сложным, и умлауты могут быть созданы с использованием разных подходов. Я надеюсь, что вы не доверяете входящим данным из внешних источников, вы тщательно их дезинфицируете, и ваш юникод уже был нормализован до того, как был помещен в базу данных (если нет - сделайте это!).