在这本书中,有很多关于排序错误的问题 SELECT
以及 INSERT * SELECT
声明。我的是一个简单的 INSERT
除了数据什么都没有。
进程中产生的错误是:
操作“=”的排序规则(utf8\u unicode\u ci,隐式)和(utf8\u general\u ci,隐式)非法混合
所有字段名和表名都已简化。正在执行的查询是:
INSERT INTO table1 (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`) VALUES (?,?,?,?,?,?,?,?,?,?);```
它已经准备好用jdbi接收java进程带来的一些数据。
底层表没有什么奇怪的地方。它们的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
我已经解决了这个问题,在我的测试运行移动所有字段排序规则为默认值和表排序规则为默认值 utf8_general_ci
在 table1
. 然而,这是一个不可接受的问题解决方案,它并没有接近于回答为什么在一个简单的insert语句中会有排序规则混淆?
1条答案
按热度按时间mnowg1ta1#
我找到了罪犯。此表上有一个触发器引用另一个架构中的另一个表。触发器语句中存在冲突,这无助于错误消息不提及此类事实。
这就是答案
简单的insert语句中怎么会有排序规则混淆呢?
插入时有一个触发器