我们使用Oracle构建和维护一个相当大规模的企业Web应用程序,以满足我们的数据库需求,现在正在转换到MySQL。我知道两者之间存在一些语法差异。但除此之外,我还应该记住其他什么?
例如,我知道MySQL不支持存储过程,这就是我们将程序转换为Java代码的原因。
我在问我们可能遇到的潜在障碍,以及为那些人提供哪些解决方案?
请不要建议不使用MySQL,因为我们已修复此问题。
答案 0 :(得分:4)
虽然"我知道MySQL并不支持存储过程"有点麻烦,你是对的:MySQL没有一种编程语言,比如他们的DBMS中嵌入了Oracle的PL / SQL,这极大地限制了存储过程和触发器。如果您使用了许多触发器,甚至可能是复合触发器,那么您可能很难以某种方式替换它们。
除此之外,还有一些想到的事情:
ROW_NUMBER
。重写查询可能很难,而且容易出错。然后某些功能可能有点不同甚至缺失,必须重写
CONCAT
。没什么大不了的,但还是要改写很多。ORDER BY NULLS FIRST / LAST
子句。ROWNUM
可以通过LIMIT
以某种方式进行模拟,但前者适用于WHERE
,后者适用于后者。因此在重写时要小心。TRANSLATE
,DECODE
,... 还有一件事:在MySQL中执行update table 1 ...; update table2 ...; rollback;
时,默认情况下只会回滚第二次更新!您必须将 system autocommit 变量设置为零以避免这种情况,并切换到Oracle中的事务行为。
答案 1 :(得分:3)
为了补充其他答案,您需要重新学习查询优化。
MySQL的SQL优化器要简单得多。这意味着:
当您发现查询速度缓慢并且您需要重新学习查询优化时,时间将会到来(当然),因为它非常不同。
答案 2 :(得分:2)
是的,
最重要的是,
设置SQL_MODE
NULLS
插入NOT NULL
列一样。
此语句指定事务特征。它采用逗号分隔的一个或多个特征值的列表。这些特性设置事务隔离级别或访问模式。隔离级别用于InnoDB表上的操作。可以指定访问模式以确定事务是以读/写还是以只读模式操作。
示例:
SHOW COLLATION;
SHOW CHARACTER SET;
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
最后,致Thorsten Kettner的评论
concat运算符||缺席。 MySQL有一个函数CONCAT。没什么大不了的,但还是要重写一遍。
这是真的但是可以由SQL_MODE PIPES_AS_CONCAT
控制
作为一个例子,这是我个人过去使用过的一个设置。这只是一个例子,可以让您 - 您的团队了解要查找的内容。
SET @@SESSION.TRANSACTION_ALLOW_BATCHING=1;
SET @@SESSION.INNODB_STRICT_MODE = 1;
SET @@SESSION.SQL_WARNINGS = 1;
SET @@SESSION.OPTIMIZER_SEARCH_DEPTH = 12;
SET @@SESSION.SQL_MODE = "TRADITIONAL,ANSI";
-- sets the following: REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
SET @@SESSION.TX_ISOLATION = "READ-COMMITTED";
SET @@SESSION.BULK_INSERT_BUFFER_SIZE = 1024*1024*4096;
SET @@SESSION.JOIN_BUFFER_SIZE = 1024*1024;
SET @@SESSION.INNODB_LOCK_WAIT_TIMEOUT = 84600;
SET @@SESSION.INTERACTIVE_TIMEOUT = 84600;
SET @@SESSION.LOCK_WAIT_TIMEOUT = 84600;
SET @@SESSION.WAIT_TIMEOUT = 84600;
如果您对我发布的内容有任何疑问,请与我们联系。