MariaDB在''附近的语法不正确

时间:2018-04-25 14:37:15

标签: sql database mariadb heidisql

正如标题所说,我的语法错误。这是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 :(得分:1)

我认为你只需要DELIMITER个陈述。

函数本身很好,如SQL Fiddle所示(MariaDB和MySQL为此目的相同)。

尝试添加:

 DELIMITER $$

 <your function definition>

 DELIMITER ;

答案 1 :(得分:1)

工作解决方案:

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;
//

P.S。我建议避免使用函数,因为它会大大降低数据库性能。如果你的目标是性能,那么最好通过创建包含已经删除了变音符号的值的其他字段来执行数据库的非规范化

在程序中删除变音符号而不是使用mysql函数也会更好,因为unicode可能非常棘手,并且可以使用不同的方法创建变音符号。我希望您不相信来自外部来源的传入数据,您正在仔细清理它,并且在将unicode放入数据库之前已经将其标准化(如果不是 - 请执行此操作!)。