oarcle mysql 字段的区别和互换

mysql与oracle 表字段定义比较

 有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORACLE的需求,应用程序也要相应做一些修改。总结出以下几点注意事项。


 


说明


mysql


oracle


VARCHAR


变长字符串


VARCHAR[0-65535]

定义长度默认按字符长度计算,如果是GBK编码的汉字将占用2个字节


VARCHAR2[1-4000]
VARCHAR是VARCHAR2的同义词

定义默认按字节长度计算


TINYINT

SMALLINT

MEDIUMINT

INT
BIGINT


整数


TINYINT(-128-127)

SMALLINT(-32768-32767)

MEDIUMINT(-8388608-8388607)

INT(-2147483648-2147483647)
BIGINT(-9223372036854775808-9223372036854775807) 


无专用类型,

TINYINT可以用NUMBER(3,0)代替

SMALLINT可以用NUMBER(5,0)代替

MEDUIMINT可以用NUMBER(7,0)代替

INT可以用NUMBER(10,0)代替

BIGINT可以用NUMBER(20,0)代替

ORACLE中有SMALLINT,INT,INTEGER类型,不过这是NUMBER(38,0)的同义词


DECIMAL
NUMERIC


数值类型


DECIMAL[1-65[,0-30]]
NUMERIC是DECIMAL的同义词


NUMBER 可表示数范围:1*10^-130至1*10^126

NUMBER([1-38][,-84-127])

 

DECIMAL、NUMERIC、DEC是NUMBER的同义词


FLOAT


浮点型


FLOAT(D,M)


oracle10g开始增加BINARY_FLOAT类型

10g以前无专用类型,可以用NUMBER代替

ORACLE中有FLOAT和REAL类型,不过这是NUMBER的同义词


DOUBLE


双精度浮点型


DOUBLE(D,M)


oracle10g开始增加BINARY_DOUBLE类型

10g以前无专用类型,可以用NUMBER代替

ORACLE中有DOUBLE PRECISION类型,不过这是NUMBER的同义词


BIT


位类型


BIT(1-64)



DATETIME


日期类型


DATE,3字节存储,只存储日期,没有时间,支持范围是[1000-01-01]至[9999-12-31]
TIME,3字节存储,只存储时间,没有日期,支持范围是[-838:59:59]至[838:59:59]
DATETIME,占8字节存储,可表示日期和时间,支持范围是[1000-01-01 00:00:00]至[9999-12-31 23:59:59]
TIMESTAMP,占4字节存储,可表示日期和时间,范围是[1970-01-01 00:00:00]至[2038-01-19 03:14:07]


DATE类型
7字节存储,可表示日期和时间,支持范围是[-4712-01-01 00:00:00]至[9999-12-31 23:59:59]


TIMESTAMP


高精度日期


5.6.4以前不支持小数秒精度
5.6.4开始TIME,DATETIME,TIMESTAMP支持,最多可以6位小数秒,也就是微秒级别


TIMESTAMP[0-9]
占用空间7-11个字节,当小数秒精度为0时与DATE类型相同,小数秒最高精度可达9位,也就是纳精度


YEAR


年份


YEAR,1字节存储,只存储年份,支持范围是[1901]至[2155]


无对应类型,可以用NUMBER(3,0)代替


CHAR


定长字符串


CHAR[0-255],定义长度默认按字符长度计算,最大保存255字符


CHAR[1-2000]

定义默认按字节长度计算


UNSIGNED


无符号说明


支持,用于数值类型


不支持


CLOB


大字符串,一般用于存储文本文件或超大描述及备注类信息


TINYTEXT 最大支持255个字节
TEXT最大支持65535个字节
MEDIUMTEXT最大支持16MB个字节
LONGTEXT最大支持4GB字节

字段不支持默认值


支持(CLOB)
oracle10g以前最大支持4GB个字节

oracle10g开始最大支持4GB个数据块,数据块大小为2KB-32KB

oracle还有一个LONG类型,是早期的存储大字符串类型,最大支持2GB字节,现已不推荐使用


BLOB


大二进制对象,一般用于存储文件或图片数据


TINYBLOB 最大支持255个字节
BLOB最大支持65535个字节
MEDIUMBLOB最大支持16MB个字节

LONGBLOB最大支持4GB字节

 

字段不支持默认值


支持(BLOB)

oracle10g以前最大支持4GB个字节

oracle10g开始最大支持4G个数据块,数据块大小为2KB-32KB

oracle还有一个LONG RAW类型,是早期的存储二进制类型,最大支持2GB字节,现已不推荐使用


BINARY


二进制信息


BINARY(0-255),定长
VARBINARY(0-65535),变长


RAW(1-2000)


ENUM


枚举类型


ENUM(v1,v2,v3,...),最多65535个元素


不支持


SET


集合类型


SET(v1,v2,v3,...),最多64个元素


不支持


NATIONAL CHAR


国际化字符集类型,较少使用


无,MYSQL可以对每个字段指定字符编码


支持
NCHAR(1-2000)
NVARCHAR(1-4000)
NCLOB


BFILE


外部文件指针类型


不支持


支持
文件大小最大4GB
文件名称最长255字符


自定义数据类型


 


不支持


支持


XML类型


 


不支持


支持


自增类型


自动增长类型


支持
使用简单


不支持
一般使用SEQUENCE解决,用法与自增类型差别较大,使用较复杂,但能实现非常灵活的应用,包括字符自增主键、全局主键等等


字段默认值表达式


 


不支持函数和表达式
TEXT和BLOB字段类型不支持默认值


支持函数和表达式


字段顺序修改


 


支持,例如,把emp表的id字段顺序放在name字段后面:
alter table emp modify column id varchar(20) after name;


不支持,只能重建表或字段


虚拟字段


虚拟字段是一个逻辑字段定义,其结果值通常是一个表达式,并在表中存储物理值,不占用空间,主要用于简化查询逻辑。比如有一个商品销售表有单价和数量两个字段,那可以建一个虚拟字段金额,其表达式=单价*数量


不支持


11g支持,例:
create table sales
(
  id       number,
  quantity number,
  price    number,
  amount   GENERATED always as (quantity*price) virtual
);


表字段数限制


 


INNODB 最大1000个字段
所有字段总定义长度不能超过65535字节
所有固定长度字段的总长度不超过半个数据块大小(数据块大小一般为16K)


最大1000个字段

另外:

1. 自动增长的数据类型处理
          MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

    CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1        START        WITH        1 MAXVALUE        99999        CYCLE        NOCACHE;
    其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999
          INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL

2. 单引号的处理
          MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

3.  翻页的SQL语句的处理
          MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
    以下是经过分析后较好的两种ORACLE翻页SQL语句( ID是唯一关键字的字段名 ):
    语句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3; 
  
    语句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

4. 长字符串的处理
    长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出。

5.         日期字段的处理
           MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘<st1:chsdate isrocdate="False" islunardate="False" day="1" month="8" year="2001">2001-08-01</st1:chsdate>’,’YYYY-MM-DD’)年-月-日 24小时:分钟:秒 的格式YYYY-MM-DD
HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘<st1:chsdate isrocdate="False" islunardate="False" day="1" month="8" year="2001">2001-08-01</st1:chsdate>’,’YYYY-MM-DD HH24:MI:SS’)

    日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;

6.  空字符的处理
           MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

7. 字符串的模糊比较
          MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果。

8. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。

时间: 2024-10-19 06:44:59

oarcle mysql 字段的区别和互换的相关文章

mysql字段设置某种情况下的特殊值

问题描述 mysql字段设置某种情况下的特殊值 是这样的,上传视频转码成功后url设置到videochangeurl字段,但是有不成功的情况,现在前辈想设置成false,这个字段是varchar类型的,而且前端页面判断是否转码失败jstl的话eq 'false',看着也奇怪,我心里觉得设置false不适合,但是又不好反抗前辈,就算反抗人家也根本不理会你,本着对自己负责,学习的态度,问问大家,这种情况怎么处理好. ps:看了前两个回答,补充下,如果不上传视频的话,没视频的话为为空的,要区别开没不上

MySQL字段加密和解密

MySQL字段加密和解密 1.加密:aes_encrypt('admin','key') 解密:aes_decrypt(password,'key') 2.双向加密 通过密钥去加密,解密的时候的只有知道这个密钥的人来解密 加密:encode() 解密:decode() eg:encode('123456' 'adfdgfdhggfh'); decode(password,'adfdgfdhggfh'); 3.PASSWORD('123456') password加密是不可逆转的 4.MD5('1

【MySql】mysql 字段个数的限制

看到itpub 论坛上有关于mysql数据库表中字段个数的讨论 ,讨论mysql字段个数限制在2559个! 自己做了测试,个数对存储引擎不同而不同!innodb 创建到第1001个时会报  Can't create table 'yang.#sql-c6d_421' (errno: 139)的错误! 下面是测试过程~ mysql> select version(); +------------+ | version()  | +------------+ | 5.5.18-log | +----

mysql-请教一个关于Mysql字段值连接问题

问题描述 请教一个关于Mysql字段值连接问题 现在的需求是把某记录end的字段 和 下一条记录的begin字段作比较 ,如果是相邻的,并且continent和country字段相同,则把这两个记录合并成一条.如上图红框所示,把红框的合并成一条记录,begin是红框内第一条记录的begin,end是红框内最后一条记录的end.目的是为了缩小匹配的范围. 解决方案 MySQL更新一个值为null的字段 解决方案二: 这个可以用GROUP_CONCAT(),其中分组条件为continent和coun

Mysql字段原值加1问题,php+mysql

问题描述 Mysql字段原值加1问题,php+mysql 很多天前就发现的问题,当时以为是自己机器问题,现在上传云服务器还是没能解决,望大神助我~ 首先是我的个人博客文章在Mysql里有个Look字段,每次查看这个博客,这个字段便在原值上加1,但问题是我每次点击查看它总是原值加2,这真的令我费解,看源码 public function viewBlog(){ $_sql='SELECT * FROM blog WHERE id='.$this->_id.' AND verify=1'; $_sq

mysql 主备切换 主从互换

问题描述 mysql 主备切换 主从互换 如题,我有两个数据库 主库 A 192.168.30.128 备库 B 192.168.28.129 现在的情况是我把两台数据库用主从复制模式,主库开启binlog,备库通过主库binlog重演主库,生产主库备份.主库master 备库slave ,备库作为了只读数据库,现在主库挂了,有何办法能使主库失效,应用直接启动备库 解决方案 MYSQL主备复制结构搭建与切换mysql 主从热备,主主互备mysql主从切换

mysql 字段as详解及实例代码_Mysql

mysql 字段使用as 在mysql中,select查询可以使用AS关键字为查询的字段起一个别名,该别名用作表达式的列名,并且别名可以在GROUP BY,ORDER BY或HAVING等语句中使用.例如: SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name; 别名与select查询一起使用时,AS关键字是可选的.上面的SQL语句也可以这样写: SELECT CONCAT(la

设计数据库必读 mysql 字段大全 大小 范围 用途 区别

MYSQL的所有字段使用大全,必读,身藏 1.mysql的数值类型 列类型                       需要的存储量 TINYINT                         1 字节  SMALLINT                      2 个字节  MEDIUMINT                   3 个字节  INT                                 4 个字节  INTEGER                      

如何对调MySQL字段中的某些列

问题:表 t 有个字段叫做 c,现在想要把 c 里面的第 10 和 第 11 列位置对调一下,咋办啊? 答案:用下面的办法吧,不过本例只对ascii字符有作用,中文或其他的就另外想办法. mysql>set @pos1 = 10; mysql>set @pos2 = 11; mysql>UPDATE t SET c = CONCAT( LEFT(c,@pos1-1), -- 第 10 列以前的值 SUBSTR(c,@pos2,1), -- 第 11 列的值 SUBSTR(c,@pos1+