【问题标题】:MariaDB incorrect syntax near ''MariaDB '' 附近的语法不正确
【发布时间】:2018-04-25 14:37:15
【问题描述】:

正如标题所说,我的语法在某处有错误。这是 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 中执行此查询。

【问题讨论】:

    标签: sql database mariadb heidisql


    【解决方案1】:

    我认为你只需要DELIMITER 语句。

    函数本身没问题,如SQL Fiddle 所示(MariaDB 和 MySQL 相同)。

    尝试添加:

     DELIMITER $$
    
     <your function definition>
    
     DELIMITER ;
    

    【讨论】:

      【解决方案2】:

      一个可行的解决方案:

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

      附:我建议避免使用函数,因为它会大大降低数据库性能。如果您的目标是性能,那么最好通过创建带有已删除元音变音的值的附加字段来执行数据库的非规范化

      最好在程序中删除变音符号,而不是使用 mysql 函数,因为 unicode 可能非常棘手,并且可以使用不同的方法创建变音符号。我希望您不信任来自外部来源的传入数据,您正在仔细清理它,并且您的 unicode 在它被放入数据库之前已经被规范化(如果没有 - 这样做!)。

      【讨论】:

      • 在这种情况下,性能并不重要。没有程序,就这个函数+一条更新语句,我的目标是把first_name列的每个变音符号都去掉,数据库已经填满了。
      猜你喜欢
      • 2015-12-12
      • 2013-12-16
      • 1970-01-01
      • 2018-08-14
      • 2011-03-11
      • 2014-02-16
      • 2017-01-11
      • 2020-02-06
      相关资源
      最近更新 更多