bug fix:
修复mysql 5.5在存储过程中调用函数,做字符串连接时,在DB上执行正常,DR同步失败报1270错误如下:
Last_SQL_Errno: 1270
Last_SQL_Error: Error 'Illegal mix of collations (utf8_general_ci,COERCIBLE), (latin1_swedish_ci,IMPLICIT), (utf8_general_ci,COERCIBLE) for operation 'concat'' on query.

该错误是由于在DB上的存储过程中,执行concat(返回utf8的函数,存储过程中定义的int变量bb),从而触发5.5的这个bug.
CONCAT(nvl('a',0),name_const('bb',0));

该问题根本原因为: 在5.0中,name_const('bb',0)返回结果集编码为my_charset_bin,而在5.5中,name_const('bb',0)返回结果集编码为my_charset_latin1.
在concat中,如果一个参数的编码为binary,则结果集使用binary,任何字符集都可以将结果转换为my_charset_bin.所以，上述语句在5.0中不会出现，因为5.0默认的数字编码为binary。
5.5中将数字的编码从binary修改为latin1后，name_const的返回结果默认为latin1,nvl函数返回为utf8,由于name_const的DERIVATION为IMPLICIT,而nvl函数调用返回结果的DERIVATION为COERCIBLE,COERCIBLE没有IMPLICIT级别高,因此,nvl的utf8结果集需要向name_const的latin1转换,但是这个转换可能导致信息丢失,在mysql内部是不允许的.因此程序报错.
5.5中name_const函数会在内部将结果集的DERIVATION修改为IMPLICIT,所以所有name_const的数字与utf8等多字节编码的字符串连接,slave跟进都会报错.
修改方法:
取消将name_const结果集的DERIVATION设置为DERIVATION_IMPLICIT的强制行为,而是采用默认语法解析的结果,,这样数字name_const就是DERIVATION_NUMBERIC,该级别低于函数返回结果集的DERIVATION_COERCIBLE,在与其他字符集做concat时,latin1编码可以向其他编码做转换.

修改影响:
本修改只影响所有使用name_const的语句.由于该语句只在mysql内部使用,影响范围有限.

相关bug:
http://bugs.mysql.com/bug.php?id=69292
目前官方还没有修复该bug.
Merge branch 'master' of https://github.com/GCSAdmin/GCS-SQL