客户用的数据库是mysql,而研发好的产物撑持oracle,为了让客户掏腰包,我们必需把数据库情形年夜oracle转向mysql。我们在转换的过程中碰着了下面一些问题,但愿能给同样遭遇的同仁们一些借鉴。如不美观我们在最初的设计、编码过程中注重数据库的移植性,这种情形下可以完全不需要作额外工作。
# @& B Y( C- q& R: W& D# Y0 N$ e: F
7 W% h B5 o% |$ T7 b 一、数据库情形年夜oracle转向mysql碰着的问题。
% u9 t7 V }) l, W) ?; X7 h7 ~" G* f6 {* ?
因为逻辑不变,所以原则是不改应用轨范代码,只改数据库表的建树/初始化sql。下面是我们碰着的问题以及解决法子。
2 ^: P9 C7 C+ W5 N1 R+ m( n6 c* j N3 h( ?6 }
1、 巨细写敏感的区别(如不美观处事器OS是linux)。. y$ e$ G7 O2 F% f" N: T
1 r2 c) ^, |6 [8 ~8 S 在oracle一一般情形下不区分巨细写。有时辰我们在使用oracle不注重巨细写的问题,表名和字段名不加双引号是不区分巨细写的,像这样:insert into tableName 和 insert into TABLENAME效不美观是一样的,用工具导出建树/数据初始化剧本,获得的结不美观一般表名和字段名转化成了年夜写。6 c1 q! W( g% b6 d; m
* Q7 c9 |" ]" p2 p. U% L2 D3 P7 b" P
但在MySQL中,所使用操作系统的巨细写敏感性抉择了数据库名和表名的巨细写敏感性。数据库对应数据目录中的目录,数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。是以,使用数据库或表现实上是独霸这些文件(夹),所以使用操作系统的巨细写敏感性抉择了数据库名和表名的巨细写敏感性。在以linux为内核的操作系统中是巨细写敏感的。+ _4 q& K6 B0 R
5 F* B t7 L! n1 ]* X$ [
解决的法子是把mysql的数据库名和oracle的巨细写连结一致,表名与应用轨范中sql字符串中的表名连结一致,如不美观应用轨范中字段名用了双引号,那请把sql中的字段名巨细心暌闺双引号里的字符连结一致。如不美观你的应用轨范所引用的表名、字段没有统一巨细写,那麻烦就年夜了。
- k8 V' x* T6 l2 t
; b/ q# p+ ?) \% \- E# v, Z 2、保留字的区别。4 q8 u; y9 U- w: Y) M8 U. @/ \
/ |+ Z: l5 l' _: ]8 w" K
像sql说话的函数名(如:inteval,show)等是保留字。Oracle中保留字是可以作为表名和字段名,而且不影响使用,但mysql中保留字是不能作为表名和字段名,如不美观使用会报语法错误。' i. K5 G' d. W# `$ R
: b) j; W2 K' C% E( o
解决法子,把sql语句中的保留字用‘`’符号引起来,这个符号位于键盘的tab键膳缦沔; 如不美观是字段名还有此外一种体例tablename.字段名。像这样:insert into tablename (id, `interval`) value(….. 或insert into tablename (id, tablename.inteval) value(….. 。
8 _6 l. B% T, E+ x0 m9 B
: D8 v3 a$ q' {, @4 S 3、数据类型的区别。$ p% G0 ~+ U) {, W3 \8 t
' U: {9 S8 M2 L5 g9 d
在mysql中没有像oracle中的varchar2、number,mysql有与之对应的varchar、numeric,当然在oracle中没有mysql的time类型。
. q) r8 u: p. C3 u/ c- A E" \4 q2 V1 S8 F& B/ G
解决法子是替代。 |