【问题标题】:mySQL function behaves differently on 2 servers which are essentially the samemySQL 函数在基本相同的 2 台服务器上表现不同
【发布时间】:2014-05-02 19:29:13
【问题描述】:

好吧,这是一个艰难的... 我有一个带有 mySQL 5.1.73 的开发服务器,我在其上编写了一个函数来规范化字符串以进行搜索。 将函数移动到生产环境时,相同的mySQL版本,相同的主要OS版本(CentOS 6.5)最新补丁,相同的主要内核版本等。该函数停止工作。

这里是函数

  CREATE DEFINER=`user`@`%` FUNCTION `normalize`(str VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
  BEGIN
     DECLARE normstring VARCHAR(255);
     DECLARE i INT;

     SET i = 0;
      SET normstring = '';
      SET str = lower(str);

      loop1: WHILE i < length(str) DO
        CASE substring(str,i,1)
           WHEN 'ä' THEN SET normstring = concat(normstring,'ae');
           WHEN 'ö' THEN SET normstring = concat(normstring,'oe');
           WHEN 'ü' THEN SET normstring = concat(normstring,'ue');
           WHEN 'ß' THEN SET normstring = concat(normstring,'ss');
              WHEN '/' THEN SET i = i + 1; ITERATE loop1;
              WHEN '.' THEN SET i = i + 1; ITERATE loop1;
              WHEN '-' THEN SET i = i + 1; ITERATE loop1;
              WHEN '(' THEN SET i = i + 1; ITERATE loop1;
              WHEN ')' THEN SET i = i + 1; ITERATE loop1;
              WHEN ' ' THEN SET i = i + 1; ITERATE loop1;
              WHEN '\'' THEN SET i = i + 1; ITERATE loop1;
              WHEN '\\' THEN SET i = i + 1; ITERATE loop1;
           ELSE SET normstring = concat(normstring,substring(str,i,1));
        END CASE;
         SET i = i + 1;
     END WHILE;
  RETURN normstring;
  END$$
  DELIMITER ;

在开发服务器上,这会将“Mönßtär”转换为“moensstaer”,但在生产服务器上会将其转换为“mönßtä”

改变 SET i = 0;WHILE i &lt; length(str)SET i = 1;WHILE i &lt;= length(str) 更正丢失的最后一个字符,所以结果是“mönßtär”,但一台服务器不应该从 0 开始计数,而另一台则从 1 开始计数,对吗? 并且生产服务器保持所有特殊字符不变。

我比较了 所有 全局变量,不仅是在 my.cnf 中明确设置的那些,而且除了时区、密码和符号链接设置之外,它们都是相等的(是的,我应该更正这些差异,但应该有跟我的问题无关吧?)

是否有一些可以影响这种行为的编译设置,或者 mySQL 使用的一些外部库? 我可能不得不为这个问题找到一个解决方法——我计划在应用程序而不是数据库中进行规范化——无论如何,这个函数在大型查询中太慢了——但是转换数据库中的现有数据会很好。但我真的很好奇是什么导致了这种奇怪的行为。

两台服务器上的字符集设置(来自运行环境):

character_set_client........................ utf8
character_set_connection.................... utf8
character_set_database...................... utf8
character_set_filesystem.................... binary
character_set_results....................... utf8
character_set_server........................ utf8
character_set_system........................ utf8
collation_connection........................ utf8_unicode_ci
collation_database.......................... utf8_unicode_ci
collation_server............................ utf8_unicode_ci

【问题讨论】:

    标签: mysql utf-8 stored-functions


    【解决方案1】:

    我相信您的本地环境和生产环境之间的字符集不同。查看这些文章,了解如何检测How do I find out the default server character set in mysql? 以及如何更改Change server variable character_set_server

    【讨论】:

    • 不,除了我提到的变量之外,双方的所有服务器设置都完全相同。一切都设置为 utf8。
    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多