我在Amazon RDS上使用MySQL 5.6.22(InnoDB)。我试图将所有表,列,连接和数据库字符集以及排序规则设置都设置为utf8mb4 / utf8mb4_unicode_ci。在任何地方都没有字符集的情况下latin1,我找不到任何证据,但是当我执行以下代码时(通过node- mysql或直接在Mac上的“ Sequel Pro”应用程序中):
latin1
update MyTable m set m.Column8 = 1 where m.Column3 = 26 and m.Column4 = 76 collate utf8mb4_unicode_ci
我收到此错误消息:
COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1'
我找不到在配置中设置的 任何内容latin1。
输出show variables like "char%":
show variables like "char%"
character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8mb4 character_set_filesystem utf8mb4 character_set_results utf8mb4 character_set_server utf8mb4 character_set_system utf8 character_sets_dir /rdsdbbin/mysql-5.6.22.R1/share/charsets/
输出show variables like "collation%":
show variables like "collation%"
collation_connection utf8mb4_unicode_ci collation_database utf8mb4_unicode_ci collation_server utf8mb4_unicode_ci
MyTable的CREATE TABLE信息是:
CREATE TABLE `MyTable` ( `Column1` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `Column2` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `Column3` bigint(20) unsigned NOT NULL, `Column4` bigint(20) unsigned NOT NULL, `Column5` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `Column6` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `Column7` varchar(112) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `Column8` tinyint(1) unsigned NOT NULL, `Column9` decimal(16,14) DEFAULT NULL, `Column10` decimal(17,14) DEFAULT NULL, `Column11` bigint(20) unsigned DEFAULT NULL, `Column12` bigint(20) unsigned DEFAULT NULL, `Column13` timestamp(6) NULL DEFAULT NULL, `Column14` timestamp(6) NULL DEFAULT NULL, `Column15` tinyint(4) NOT NULL DEFAULT '1', `Column16` tinyint(4) NOT NULL DEFAULT '1', `Column17` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `Column18` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `Column19` bigint(20) unsigned DEFAULT NULL, PRIMARY KEY (`Column1`), KEY `IX_Reevues_Column3` (`Column3`), KEY `IX_Reevues_Column4` (`Column4`), KEY `IX_Reevues_Column6` (`Column6`), KEY `IX_Reevues_Column8` (`Column8`), KEY `IX_Reevues_Column2` (`Column2`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
在将BIGINT与文字数字进行比较时,为什么要有COLLATE子句? 在UPDATE语句中删除COLLATE子句。 -根据OP的评论,这是主要解决方案。
使用latin1构建的存储例程中的代码是否存在?请执行SHOW CREATE PROCEDURE(或FUNCTION)来查看是否是这种情况。如果是这样,则请删除并使用有效的utf8mb4重新创建它。
更改character_set_filesystem和character_set_server是有风险的。改回来。