java - MySQL 对简单 INSERT 操作“=”的排序规则的非法混合
问题描述
有很多关于SELECT
和INSERT * SELECT
语句中的排序规则混淆的问题。我的很简单INSERT
,除了数据之外什么都没有。
过程中产生的错误是:
用于操作“=”的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合
所有字段名称和表名称都已简化。正在执行的查询是:
INSERT INTO table1 (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`) VALUES (?,?,?,?,?,?,?,?,?,?);```
它已经准备好接收一些由 Java 进程使用 JDBI 引入的数据。
基础表没有什么奇怪的。他们的 DDL 如下所示。
CREATE TABLE `table1` (
`a` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`b` varchar(6) COLLATE utf8_unicode_ci DEFAULT NULL,
`c` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`d` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`e` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`f` int(11) DEFAULT NULL,
`g` text COLLATE utf8_unicode_ci,
`h` bigint(20) DEFAULT NULL,
`i` bigint(20) DEFAULT NULL,
`j` datetime DEFAULT NULL,
`k` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`a`,`e`),
KEY `c` (`c`,`d`),
CONSTRAINT `fk_1` FOREIGN KEY (`a`) REFERENCES `table2` (`a2`),
CONSTRAINT `fk_2` FOREIGN KEY (`c`, `d`) REFERENCES `table3` (`a3`, `b3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `table2` (
`a2` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`b2` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`c2` mediumtext COLLATE utf8_unicode_ci,
`d2` mediumtext COLLATE utf8_unicode_ci,
`e2` bigint(11) DEFAULT '0',
PRIMARY KEY (`a2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `table3` (
`a3` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`b3` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`a3`,`b3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
可以看出,排序规则绝对没有我能理解的东西。是否有可能是来自 java 世界的数据导致了这种情况?它可能与当前的连接会话变量有关吗?
更新
我忘了添加 MySQL 版本:5.6
我已经在我的测试运行中解决了这个问题,将所有字段排序规则移动到DEFAULT并将表排序规则移动到utf8_general_ci
on table1
。然而,这是一个不可接受的问题解决方案,它不能回答简单的 INSERT 语句中怎么会有排序规则混淆?
解决方案
我找到了罪魁祸首。此表上有一个 TRIGGER,它引用了另一个模式中的另一个表。触发器语句中存在冲突,这无助于错误消息没有暗示这一事实。
那答案
一个简单的 INSERT 语句中怎么会有排序规则混淆?
INSERT 附带一个 TRIGGER
推荐阅读
- php - Laravel 是否处理保留的 PHP 和 MySQL 单词?
- angular - 应用程序在本地正常命中第三方休息服务,但无法运行 Docker 容器
- angular - msal.js 访问令牌中的自定义声明
- javascript - 将时区设置为“欧洲/伦敦”时,IE 11 抛出“'timeZone' 超出有效范围”
- python - OSError: [Errno 12] 使用 python 多处理池时无法分配内存
- node.js - 种子 MongoDB 数据
- javascript - 在节点 js 上读取 .psv 文件内容花费的时间太长(超过 200 万行数据)
- javascript - 为什么 draft-js / react-rte 不会在文本编辑器中加载 iframe?
- sql-server - 在 SQL 中将一个长字符串拆分为一组较短的字符串
- netlogo - 如何更新用于在循环中选择海龟的比例?