我如何解决"整理对于CHARACTER SET' latin1'"?无效?

时间:2017-09-22 17:01:28

标签: mysql rds

我知道这个问题很多,但由于我已经尝试过每一个答案,我想再次提出更详细的信息。

我将数据从不同的数据库(不同的结构化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上。

1 个答案:

答案 0 :(得分:0)

因此问题似乎来自过程(null_if_empty)排序规则和字符集。那些被设置为latin1和latin1_swedish_ci。 MySQL文档说;

  

如果CHARACTER SET和COLLATE属性不存在,则使用在例程创建时生效的数据库字符集和排序规则。为避免服务器使用数据库字符集和排序规则,请为字符数据参数提供显式CHARACTER SET和COLLATE属性。

     

如果更改数据库默认字符集或排序规则,则存储   必须删除并重新创建使用数据库默认值的例程   这样他们就可以使用新的默认值。

此答案也说明了

https://stackoverflow.com/a/35560779/1092406