我已将 MySQL 从版本 5.7 升级到 8。我已从旧 MySQL 5.7 导出数据库,现在我正在尝试将数据库导入 MySQL 8。但是对于具有联合子句的数据库视图之一出现错误。
错误是 -
#1267 - Illegal mix of collations (utf8mb4_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation 'UNION'
观点是——
CREATE VIEW VIEW_ALL_ORDER_ITEMS_REF AS
select * from VIEW_ORDER_ITEM_EQ_REF
union
select * from VIEW_ORDER_ITEM_SO_REF
union
select * from VIEW_ORDER_ITEM_OA_REF
union
select * from VIEW_ORDER_ITEM_WO_REF
union
select * from VIEW_ORDER_ITEM_DO_REF
当我尝试在两个以上的视图之间应用联合时,我遇到了这个错误。
这个视图很好用。
drop view if exists VIEW_ALL_ORDER_ITEMS_REF;
CREATE VIEW VIEW_ALL_ORDER_ITEMS_REF AS
select * from VIEW_ORDER_ITEM_EQ_REF
union
select * from VIEW_ORDER_ITEM_SO_REF
任何人都可以帮忙吗?
当您从 MySQL 转储中恢复数据库时,您可以通过更改表、函数和过程的字符集和排序规则来解决您的问题,同时还可以使您的数据库面向未来。MySQL 5.7 和 8.x 之间有许多变化,所以这确实是这样做的最佳时机。
以下是您可以对每个
CREATE
语句执行的操作:替换
DEFAULT CHARSET
到utf8mb4
替换
COLLATE
到utf8mb4_unicode_ci
(对于表格)确保
ENGINE
设置为InnoDB
注意:您不想再使用 MyISAM,也不想将
ENGINE
类型与查询混合使用,因为这会对性能造成相当大的影响。使用您喜欢的文本编辑器完成所有这些操作,然后将导入过程运行到新的 MySQL 数据库中。确保将数据库
DEFAULT CHARSET
和COLLATE
值设置为与表、函数和过程相同。建议的推理:
MySQL 8.0 与 5.x 线有很大的不同,其中大量在 5.2 之前被弃用的项目被完全删除。这包括某些列类型以及排序规则。导入过程将尝试自动将已弃用的元素调整为现代等效元素,但通常会弄乱字符集和排序规则。
在
utf8mb4_unicode_ci
处理多字节字符(例如表情符号和非英语语言中使用的字符)时,事实证明这是最可靠的排序规则。虽然它会使用更多的磁盘空间,但这将确保您的应用程序可以处理向其抛出的任何字符。最后的_ci
位确保在加入和查找时将值视为不区分大小写。替换所有
CHARSET
和COLLATE
值将确保您不会Illegal mix of collations
再次收到错误...除非...存储过程和触发器需要考虑的事项
在存储过程中创建临时表时,MySQL 8.0 似乎期望有更多的特殊性。如果您使用临时表,请务必在代码中预定义它们,就像使用普通表一样。语法几乎相同,只是您要添加一个附加词:
Illegal mix of collations
这将确保您在使用存储过程时不会遇到错误。如果您的表具有
BEFORE INSERT
或BEFORE UPDATE
触发器,并且这些表是通过存储过程填充的,那么您将需要在将数据库放入生产设置之前进行大量测试。Oracle 在 8.0.25 中引入了一个非常严重的错误,当触发器作为数据验证的一部分处理行时,可能会导致 MySQL 服务器引擎在某些情况下崩溃BEFORE
,但前提是该数据由存储过程提供。这个问题已经存在了一年多,而甲骨文似乎并不在意。不要让这个虫子像去年一样毁了你的新年假期?