mySQL函数在两台基本相同的服务器上表现不同

时间:2014-05-02 08:44:58

标签: mysql utf-8 stored-functions

好吧,这是一个艰难的... 我有一个带有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 < length(str) 至      SET i = 1;WHILE i <= 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

1 个答案:

答案 0 :(得分:0)

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