a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 138|回复: 1

[考试辅导] Oracle技术:关于oracle移植到mysq的l注意事项

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
客户用的数据库是mysql,而研发好的产物撑持oracle,为了让客户掏腰包,我们必需把数据库情形年夜oracle转向mysql。我们在转换的过程中碰着了下面一些问题,但愿能给同样遭遇的同仁们一些借鉴。如不美观我们在最初的设计、编码过程中注重数据库的移植性,这种情形下可以完全不需要作额外工作。$ e; ]' h" S3 m& \! |$ ~9 o: }* K9 r

! q& W9 u8 m3 F+ k  一、数据库情形年夜oracle转向mysql碰着的问题。
& ^% E" B0 B/ Y9 t! b
8 Z8 \0 M  {5 z% x% O% j  因为逻辑不变,所以原则是不改应用轨范代码,只改数据库表的建树/初始化sql。下面是我们碰着的问题以及解决法子。& v* T1 Q, _/ d# A: ^; }9 n
' l6 p8 P# n3 e4 w" E/ `
  1、 巨细写敏感的区别(如不美观处事器OS是linux)。
. g9 y0 l6 j  p( e+ [! j; A
6 x3 g; w* q4 Q; t  在oracle一一般情形下不区分巨细写。有时辰我们在使用oracle不注重巨细写的问题,表名和字段名不加双引号是不区分巨细写的,像这样:insert into tableName 和 insert into TABLENAME效不美观是一样的,用工具导出建树/数据初始化剧本,获得的结不美观一般表名和字段名转化成了年夜写。0 l/ l  ?( x$ u/ A. ~/ C& E$ K
# T' y% @, ?' B; H5 u5 a% }
  但在MySQL中,所使用操作系统的巨细写敏感性抉择了数据库名和表名的巨细写敏感性。数据库对应数据目录中的目录,数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。是以,使用数据库或表现实上是独霸这些文件(夹),所以使用操作系统的巨细写敏感性抉择了数据库名和表名的巨细写敏感性。在以linux为内核的操作系统中是巨细写敏感的。
$ X- d1 c8 X+ e+ x
3 m& m2 |1 e8 z$ R6 T# l/ \  解决的法子是把mysql的数据库名和oracle的巨细写连结一致,表名与应用轨范中sql字符串中的表名连结一致,如不美观应用轨范中字段名用了双引号,那请把sql中的字段名巨细心暌闺双引号里的字符连结一致。如不美观你的应用轨范所引用的表名、字段没有统一巨细写,那麻烦就年夜了。* f2 ?7 `+ K6 G9 ]1 _8 U* t9 [/ s
: V$ `) Q- |+ E3 `
  2、保留字的区别。/ M& D. s# S8 A" D

1 K5 B( s2 G/ a0 X7 [9 Q* \! b像sql说话的函数名(如:inteval,show)等是保留字。Oracle中保留字是可以作为表名和字段名,而且不影响使用,但mysql中保留字是不能作为表名和字段名,如不美观使用会报语法错误。) H9 i; \! ~) n$ }4 b8 V5 g# T
6 ^1 s6 Y2 j2 W* w- u$ B
  解决法子,把sql语句中的保留字用‘`’符号引起来,这个符号位于键盘的tab键膳缦沔; 如不美观是字段名还有此外一种体例tablename.字段名。像这样:insert into tablename (id, `interval`) value(….. 或insert into tablename (id, tablename.inteval) value(….. 。" c! m' `* _# d( b/ S& _
; S& i0 U# f5 p; o9 r
  3、数据类型的区别。
  h9 S: e+ o" n/ b, s! O, H1 p3 n6 c! ~* n
  在mysql中没有像oracle中的varchar2、number,mysql有与之对应的varchar、numeric,当然在oracle中没有mysql的time类型。( h& u6 a! `- o8 K+ |1 ~+ C' G/ i# {
9 ?1 q  [" T8 y6 w1 x. v9 I4 I
  解决法子是替代。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:关于oracle移植到mysq的l注意事项

  4、自动增添类型的区别。* X1 a( N  S( N- T) _+ b9 B
+ `3 j4 x% B* m! \; s1 K& m7 l
  Oracle有sequence,mysql中没有,但有auto_increment属性。9 P( V/ A& ^& b/ T" x$ S9 V

+ w+ ]1 \" C! y2 r  解决法子是把Oracle中sequence转换成使用auto_increment属性,某些情形可能还有一种法子可以解决问题,新建一个自力的表用来专门记实自动增添型的数据。
) o* h1 {+ ~- o0 l- [9 S' h! z" z$ f" p) l
  5、索引长度限制的区别。
4 M. |4 ^" e) U5 T- j; \4 H: w8 n) A$ _7 V  }
  年夜MySQL 4.1.2起头,MyISAM和InnoDB表索引长度撑持1000字节,也就是说索引字段的长度不能跨越1000字节,如不美观跨越会报这样的错:ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes。如不美观是UTF-8编码,相当于333个字符的长度(因为UTF8一个字符占3个字节)。Oracle的索引长度限制比mysql要宽松得多。
  [$ B2 j$ V, b. K6 e! T  n. M' m8 @8 A- X: {
  解决的法子就不需要多说了,要么改索引的界说,要么改字段的界说长度。7 n6 l$ ~$ Y, ?
0 ~! S$ e/ T9 c) J7 N8 e( L, x
  二、为了数据库的兼容性我们应该注重些什么。, G) \, t  d. _1 J
1 a& M$ d& O# \( `9 l1 H1 S
  数据库的兼容性应该是数据库设计应该正视的一个问题,因为有时辰客户存在已经在用的数据库,而且不但愿同时维护两个数据库,这样的话兼容多种数据库还能成为产物的一个卖点。/ ^) Z" g3 u8 F2 C( k
5 v9 |# ]& t8 G; l0 E5 f$ ^
  作到数据库的兼容性关头是遵守尺度用法。/ x( I" A0 z8 O
2 @5 E' j# k8 \+ y$ _  P
  1、 遵守尺度用法,尽量不使用某种数据库特有的用法。/ C: f  K2 r; j2 P+ Q
7 V& V" y+ A. ?- R/ k
  如msyql的‘`’符号的用法,
2 r5 u( c1 C& s1 M7 }% |1 E* z
) `# ], {) {; O  再好比,良多人有这种用法,在使用oracle开发的时辰建树sequence,往表中插数据之前先SELECT seq.nextval FROM DUAL; ,然后把发芽获得的值作为value插入表中,这种用法没法顺应没有sequence的数据库,每个数据库都有自动增添型的用法,如不美观需要使用就应该完全地使用。1 a2 B$ B& d  i, Q1 M" @
$ O# R' z( [, |( i) m  q& b$ K
  再举个例子,分歧的数据库对分页发芽作了扩展,postgresql有offset,limit,oracle就没有。! a2 ]7 Z9 K' c! {
) C3 t2 I: W' p$ _
  2、 避免数据库巨细写敏感的问题。
* o9 {1 p  H% x1 C: V
5 Y& S4 `: X, C; b- s/ L  选择数据库表名和字段名采用年夜写仍是小写,而且在数据库的设计和编码过程中完全统一。. j7 s& k5 k( q* ~  H9 `1 i
4 Z* K% W' S0 e1 X% P# p( @
  3、 保留字。
( c7 E" I1 E+ D
9 `' H  V# b; C' Z* @7 `  要求数据库设计者尽量不使用保留字作表名和字段名。也有良多人有这种用法,在表名和字段名前加‘_’,像这样:create table _tablename ( _id integer)。这样永远不会呈现保留字引起的问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-18 05:19 , Processed in 0.399483 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表