【发布时间】: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 < 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
【问题讨论】:
标签: mysql utf-8 stored-functions