为什么我会看到 "COLLATION 'xxx' is not valid for CHARACTER SET 'yyy'"
Why am I seeing "COLLATION 'xxx' is not valid for CHARACTER SET 'yyy'"
我在 Amazon RDS 上使用 MySQL 5.6.22 (InnoDB)。我试图将我所有的表、列、连接和数据库字符集以及排序规则设置设置为 utf8mb4 / utf8mb4_unicode_ci。我在任何地方都找不到任何证据表明任何东西都有字符集 latin1
,但是当我执行以下代码时(通过 node-mysql,或直接在我的 Mac 上的 "Sequel Pro" 应用程序中):
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%"
的输出:
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%"
的输出:
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有风险。改回来。
我在 Amazon RDS 上使用 MySQL 5.6.22 (InnoDB)。我试图将我所有的表、列、连接和数据库字符集以及排序规则设置设置为 utf8mb4 / utf8mb4_unicode_ci。我在任何地方都找不到任何证据表明任何东西都有字符集 latin1
,但是当我执行以下代码时(通过 node-mysql,或直接在我的 Mac 上的 "Sequel Pro" 应用程序中):
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%"
的输出:
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%"
的输出:
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有风险。改回来。