MySQL 简单 INSERT 操作“=”的排序规则混合非法
MySQL illegal mix of collations for operation '=' on a simple INSERT
SELECT
和 INSERT * SELECT
语句中有很多关于排序规则混淆的问题。我的是一个简单的 INSERT
,除了数据之外没有添加任何内容。
过程中产生的错误是:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
所有字段名称和 table 名称均已简化。正在执行的查询是:
INSERT INTO table1 (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`) VALUES (?,?,?,?,?,?,?,?,?,?);```
已准备好接收 JDBI Java 进程传入的一些数据。
底层的 table 没有什么奇怪的。他们的 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 并将 table 归类移动到 utf8_general_ci
on table1
.然而,这是一个 unacceptable 问题的解决方案,它并没有接近回答 简单的 INSERT 语句中怎么会有归类混淆?
我找到了罪魁祸首。此 table 上有一个 TRIGGER,它引用另一个架构中的另一个 table。触发器语句中存在冲突,错误消息未提及此类事实无济于事。
回答
how can there be a collation mixup in a simple INSERT statement?
INSERT 附带一个 TRIGGER
SELECT
和 INSERT * SELECT
语句中有很多关于排序规则混淆的问题。我的是一个简单的 INSERT
,除了数据之外没有添加任何内容。
过程中产生的错误是:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
所有字段名称和 table 名称均已简化。正在执行的查询是:
INSERT INTO table1 (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`) VALUES (?,?,?,?,?,?,?,?,?,?);```
已准备好接收 JDBI Java 进程传入的一些数据。
底层的 table 没有什么奇怪的。他们的 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 并将 table 归类移动到 utf8_general_ci
on table1
.然而,这是一个 unacceptable 问题的解决方案,它并没有接近回答 简单的 INSERT 语句中怎么会有归类混淆?
我找到了罪魁祸首。此 table 上有一个 TRIGGER,它引用另一个架构中的另一个 table。触发器语句中存在冲突,错误消息未提及此类事实无济于事。
回答
how can there be a collation mixup in a simple INSERT statement?
INSERT 附带一个 TRIGGER