为什么我看到“排序规则‘xxx’对于字符集‘yyy’无效”

2023-12-30

我使用的是 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'

我找不到anything set to 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;

  1. 在将 BIGINT 与文字数字进行比较时,为什么要使用 COLLATE 子句?删除 UPDATE 语句中的 COLLATE 子句。-- 根据OP的评论,这是主要的解决方案。

  2. 代码是否位于使用 latin1 构建的存储例程中?执行 SHOW CREATE PROCEDURE(或 FUNCTION)来查看情况是否如此。如果是这样,则删除并使用有效的 utf8mb4 重新创建它。

  3. 更改character_set_filesystem和character_set_server是有风险的。把它们改回来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我看到“排序规则‘xxx’对于字符集‘yyy’无效” 的相关文章

随机推荐