好吧,这是一个艰难的... 我有一个带有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
答案 0 :(得分:0)
我相信您在本地环境和制作之间有不同的字符集。查看这些文章,了解如何检测How do I find out the default server character set in mysql?以及如何更改Change server variable character_set_server。