詳解Oracle中三大類型與隱式數(shù)據(jù)類型轉(zhuǎn)換
在某些情況下,Oracle Server 會(huì)收到數(shù)據(jù)類型與預(yù)期的數(shù)據(jù)類型不同的數(shù)據(jù)。發(fā)生這種情況時(shí),Oracle Server 可自動(dòng)將該數(shù)據(jù)轉(zhuǎn)換為預(yù)期的數(shù)據(jù)類型。這種數(shù)據(jù)類型轉(zhuǎn)換可以由Oracle Server 隱式完成,也可以由用戶顯式完成。
在MySQL跟Oracle中,如果存在隱式的數(shù)據(jù)類型轉(zhuǎn)換,可能導(dǎo)致無法命中索引,從而進(jìn)行全表掃描的危險(xiǎn)。
一、類型轉(zhuǎn)換規(guī)則
MySQL類型轉(zhuǎn)換規(guī)則:
- 兩個(gè)參數(shù)至少有一個(gè)是NULL時(shí),比較的結(jié)果也是 NULL,例外是使用 <=> 對兩個(gè)NULL做比較時(shí)會(huì)返回1,這兩種情況都不需要做類型轉(zhuǎn)換
- 兩個(gè)參數(shù)都是字符串,會(huì)按照字符串來比較,不做類型轉(zhuǎn)換
- 兩個(gè)參數(shù)都是整數(shù),按照整數(shù)來比較,不做類型轉(zhuǎn)換
- 十六進(jìn)制的值和非數(shù)字做比較時(shí),會(huì)被當(dāng)做二進(jìn)制串
- 有一個(gè)參數(shù)是TIMESTAMP或DATETIME,并且另外一個(gè)參數(shù)是常量,常量會(huì)被轉(zhuǎn)換為timestamp
- 所有其他情況下,兩個(gè)參數(shù)都會(huì)被轉(zhuǎn)換為浮點(diǎn)數(shù)再進(jìn)行比較
Oracle類型轉(zhuǎn)換規(guī)則:
- 對于insert和update操作,oracle將值轉(zhuǎn)換為受影響的的列的類型。
- 對于SELECT操作,oracle會(huì)將列的值的類型轉(zhuǎn)換為目標(biāo)變量的類型。
二、Oracle中三大類型與隱式數(shù)據(jù)類型轉(zhuǎn)換
- varchar2變長/char定長-->number,例如:'123'->123
- varchar2/char-->date,例如:'25-4月-15'->'25-4月-15'
- number---->varchar2/char,例如:123->'123'
- date------>varchar2/char,例如:'25-4月-15'->'25-4月-15'
三、Oracle/MySQL如何隱式轉(zhuǎn)換
- =號(hào)二邊的類型是否相同
- 如果=號(hào)二邊的類型不同,嘗試的去做轉(zhuǎn)換
- 在轉(zhuǎn)換時(shí),要確保合法合理,否則轉(zhuǎn)換會(huì)失敗,例如:12月不會(huì)有32天,一年中不會(huì)有13月
四、Oracle隱式轉(zhuǎn)換實(shí)例
(1) 查詢1980年12月17日入職的員工(方式一:日期隱示式轉(zhuǎn)換)
- select * from emp where hiredate = '17-12月-80';
(2) 使用to_char(日期,'格"常量"式')函數(shù)將日期轉(zhuǎn)成字符串)
- select to_char(sysdate,'yyyy" 年 "mm" 月 "dd" 日 "day') from dual;
(3) 使用to_char(日期,'格式')函數(shù)將日期轉(zhuǎn)成字符串)
- select to_char(sysdate,'yyyy-mm-dd"今天是"day hh24:mi:ss') from dual;
或
- select to_char(sysdate,'yyyy-mm-dd"今天是"day HH12:MI:SS AM') from dual;
(4) 使用to_char(數(shù)值,'格式')函數(shù)將數(shù)值轉(zhuǎn)成字符串
- select to_char(1234,'$9,999') from dual;
- select to_char(1234,'L9,999') from dual;
(5) 使用to_date('字符串','格式')函數(shù),查詢1980年12月17日入職的員工(方式二:日期顯式轉(zhuǎn)換)
- select * from emp where hiredate = to_date('1980年12月17日','yyyy"年"mm"月"dd"日"');
或
- select * from emp where hiredate = to_date('1980#12#17','yyyy"#"mm"#"dd');
或
- select * from emp where hiredate = to_date('1980-12-17','yyyy-mm-dd');
(6) 使用to_number('字符串')函數(shù)將字符串‘123’轉(zhuǎn)成數(shù)字123
- select to_number('123') from dual;
注意:
- select '123' + 123 from dual;246
- select '123' || 123 from dual;123123