希望您能帮助我理解将 Oracle 12c 数据库转换为 MySQL 5.7 时遇到的特定问题。
对于上下文,假设我们有一个看起来有点像这样的表:
id firstname lastname
---------------------------
1 John Jones
2 tom smith
3 ALEX JonEs
数据可以以任何大小写或混合大小写的形式输入到表中,在应用程序级别没有控制,在数据库级别没有任何约束或触发器。
所以为了有效的查询,在Oracle中创建了一个函数式索引如下,因为我们查询lastname字段时总是会使用小写函数:
CREATE INDEX idx_table1_lastname ON schema1.table1 (LOWERCASE(lastname))
我们不能在 MySQL 中这样做,因为函数索引不是一个东西。MySQL 中的同一列已创建为排序规则utf8-general-ci
,所以我的问题是这个。
如果我们在 MySQL 数据库上创建相同的索引,我们只能这样做:
CREATE INDEX idx_table1_lastname ON table1 (lastname)
考虑到我们列的排序规则不区分大小写,索引是否有效?或者我们应该采取一些措施来确保我们对该字段的所有数据库写入都以一致的方式写入?
谢谢
MySQL 没有功能索引,但它确实有(至少在 5.7 版和 MariaDB 5.5+ 中)生成的可以索引的列。
详见官方文档:Generated Columns。
使用示例:
并在 dbfiddle.uk上进行测试,您可以在其中看到使用了索引。
现在,如果您从不需要区分并且您已经使用不区分大小写的排序规则定义了列,则不需要上述构造。您可以只对不区分大小写的列进行索引。
'Jack'
'jack'
如果您想要进行区分大小写和不区分大小写的比较,以及在 Oracle 数据库具有功能索引(即数字或日期列)的其他区域,该构造很有用。