我知道这个问题很多,但由于我已经尝试过每一个答案,我想再次提出更详细的信息。
我将数据从不同的数据库(不同的结构化MySQL 5.6.34)迁移到MySQL 5.7.16
我为不同的尝试收到以下错误;
COLLATION' utf8_unicode_ci / utf8_general_ci'对于CHARACTER SET' latin1'
无效我的参数设置为
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_general_ci
collation_database => utf8_general_ci
collation_server => utf8_unicode_ci
这两个表分别设置为utf8和utf_general_ci。
这是插入查询;
INSERT INTO t1 (detail)SELECT null_if_empty(detail) COLLATE utf_general_ci FROM t2;
这是使用的函数" null_if_empty"
CREATE DEFINER=`root`@`localhost` FUNCTION `null_if_empty`(value TEXT) RETURNS text CHARSET utf8
BEGIN DECLARE response_value TEXT DEFAULT NULL; IF (LENGTH(value) > 0) THEN
SET response_value = value; ELSE
SET response_value = NULL; END IF; RETURN response_value; END;
PS:两个数据库都保存在AWS RDS上。
答案 0 :(得分:0)
因此问题似乎来自过程(null_if_empty)排序规则和字符集。那些被设置为latin1和latin1_swedish_ci。 MySQL文档说;
如果CHARACTER SET和COLLATE属性不存在,则使用在例程创建时生效的数据库字符集和排序规则。为避免服务器使用数据库字符集和排序规则,请为字符数据参数提供显式CHARACTER SET和COLLATE属性。
如果更改数据库默认字符集或排序规则,则存储 必须删除并重新创建使用数据库默认值的例程 这样他们就可以使用新的默认值。
此答案也说明了