前言
MySQL和Oracle的SQL語句有時候寫起來不一樣,比如什麼地方用單引號 ',什麼地方用雙引號 ",甚至還有反引號 ` 等等令人挺糾結的問題,所以我來總結一下。
字段類型對比
MySQL的字段類型,和Oracle的字段類型 “貌似” 不一樣 (∩_∩),這就來對比一下:
字段分類 | 數據庫類型 | 字段類型 | 字段含義 |
---|---|---|---|
數值類型 | MySQL | TINYINT | 佔用空間: 1個字節(Byte) 數值範圍: 0~255 Java Type: Integer |
SMALLINT | 佔用空間: 2個字節(Byte) 數值範圍: -32768~32767 Java Type: Integer |
||
INT [常用] |
佔用空間: 4個字節(Byte) 數值範圍: -231~231 - 1 Java Type: Integer |
||
BIGINT [常用] |
佔用空間: 8個字節(Byte) 數值範圍: -263~263 - 1 Java Type: Long |
||
FLOAT | 單精度浮點數 佔用空間: 4個字節(Byte) Java Type: Float |
||
DOUBLE(m,d) [常用] |
雙精度浮點數,m(有效位數)和d(小數位數),m d可以不寫 佔用空間: 8個字節(Byte) Java Type: Double |
||
DECIMAL(m,d) [常用] |
佔用空間: 依賴於m(有效位數)和d(小數位數) Java Type: Double 或 Decimal |
||
數值類型 | Oracle | NUMBER(p,s) | p(有效位數)s(小數位數),它是十進制精度 佔用空間: 可以高達38位,其中p的默認值是38,s的默認值是0。如果把scale設成負數,Oracle將把該數字取捨到小數點左邊的指定位數 Java Type: Integer Long Double Decimal都行,看情況 |
DECIMAL(p,s) [常用] |
它是NUMBER(p,s)的子類型 Java Type: 看情況 |
||
FLOAT(n) | 它是NUMBER(p,s)的子類型,n可以取1~126的值 Java Type: 看情況 |
||
BINARY_FLOAT | 採用二進制精度,單精度浮點數字數據類型 佔用空間: 32位,5字節存儲空間,其中1字節用於存儲數據值的長度 Java Type: 看情況 |
||
BINARY_DOUBLE | 採用二進制精度,雙精度浮點數字數據類型 佔用空間: 64位,9字節存儲空間,其中1字節用於存儲數據值的長度 Java Type: 看情況 |
||
字符類型 | MySQL | CHAR(n) [常用] |
固定長度字符串,n可取1~255的值,n表示字符個數,而不是字節個數 Java Type: String |
VARCHAR(n) [常用] |
可變長度字符串,n可取1~65535的值 DO類型: String |
||
TINYBLOB(n) | n可取1~255的值,不超過 255 個字符的二進制字符串 Java Type: String |
||
TINYTEXT(n) | n可取1~255的值,短文本字符串 Java Type: String |
||
BLOB(n) | n可取1~65535的值,二進制形式的長文本數據 Java Type: String |
||
TEXT(n) | n可取1~65535的值,長文本數據 Java Type: String |
||
MEDIUMBLOB(n) | n可取1~16 777 215的值,二進制形式的中等長度文本數據 Java Type: String |
||
MEDIUMTEXT(n) | n可取1~16 777 215的值,中等長度文本數據 Java Type: String |
||
LONGBLOB(n) | n可取1~4 294 967 295的值,二進制形式的極大文本數據 Java Type: String |
||
LONGTEXT(n) | n可取1~4 294 967 295的值,極大文本數據 Java Type: String |
||
字符類型 | Oracle | CHAR(n) [常用] |
固定長度字符串,n可取1~2000的值,n表示字符個數,而不是字節個數 Java Type: String |
VARCHAR(n) | 【廢棄】可變長度字符串,n表示字符數,設置前需要考慮是單字節,還是多字節 佔用空間: 1~4000字節 特點: ①VARCHAR只對漢字和全角等字符佔兩字節,數字,英文字符等都是一個字節; ②VARCHAR把空字符串,就當做空字符串來處理。 Java Type: String |
||
VARCHAR2(n) [常用] |
【推薦】可變長度字符串,n表示字符數,設置前需要考慮是單字節,還是多字節 佔用空間: 1~4000字節 特點: ①一般情況下,VARCHAR2把所有字符都佔兩字節處理; ②VARCHAR2把空串等同於null處理。 Java Type: String |
||
NCHAR(n) | Unicode數據類型,根據字符集而定的固定長度字符串,最大長度2000bytes | ||
NVARCHAR2(n) | Unicode數據類型,根據字符集而定的可變長度字符串,最大長度4000bytes | ||
LONG(n) | 【廢棄】可變長字符列,最大長度限制爲2GB,用於不需要作字符串搜索的長串數據 | ||
CLOB | 最大4G,存儲單字節字符型數據。適用於存儲超長文本 | ||
NCLOB | 最大4G,存儲多字節國家字符型數據。適用於存儲超長文本 | ||
BLOB | 最大4G,存儲二進制數據。適用於存儲圖像、視頻、音頻等 | ||
BFILE | 最大長度是4GB,在數據庫外部保存的大型二進制對象文件 | ||
日期時間類型 | MySQL | DATE [常用] |
格式: yyyy-MM-dd Java Type: Date |
TIME | 格式: hh:mm:ss Java Type: java.sql.Time |
||
TIMESTAMP [常用] |
時間戳 格式: yyyy-MM-dd hh:mm:ss Java Type: java.sql.Timestamp |
||
DATETIME [常用] |
格式: yyyy-MM-dd hh:mm:ss Java Type: Date |
||
日期時間類型 | Oracle | DATE [常用] |
格式: yyyy-MM-dd Java Type: Date |
TIMSTAMP [常用] |
時間戳 格式: yyyy-MM-dd hh:mm:ss Java Type: java.sql.Timestamp |
||
TIMESTAMP WITH TIME ZONE | 時間戳的擴展,加上時區 | ||
枚舉類型 | MySQL | ENUM [常用] |
CREATE TABLE student (gender ENUM(‘Male’,‘Femal’,‘Unknown’)); |
Oracle | 沒有 | / |
引號使用對比
一行行文字,不如用表格對比來得痛快!
引號 | 數據庫類型 | 用法 |
---|---|---|
單引號 ’ | MySQL | 將字符串常量括起來,需要注意的是: ① '\'' 使用轉義,可以在兩個單引號中包含一個單引號;② "'" 也可以用兩個雙引號包圍一個單引號 |
Oracle | ① 單引號裏的內容,不區分大小寫,系統自動轉爲大寫; ② 表示字符串常量; ③ 被單引號包圍的雙引號,不需要成對出現; ④ 單引號有轉義的作用,比如 '' ,最終得到的是' ,相當於\' |
|
雙引號 " | MySQL | 將字符串常量括起來,'"' 兩個單引號包圍一個雙引號,也可以使用"\"" 轉義 |
Oracle | ① 雙引號括起來的內容,更確切一點叫引證標識符; ② 雙引號內部的字符串嚴格區分大小寫 ; ③ 用於避免和關鍵字衝突; ④ 在給列起別名時,只能加雙引號或者不加引號,但不能使用單引號; ⑤ 在to_char(value, pattern)的pattern裏時,雙引號有特殊的作用,就是將非法的字符包起來。例如 select to_char(sysdate, 'hh24'"小時"mm"分"ss"秒"') 結果就是 06時39分51秒 |
|
反引號 ` | MySQL | 用於區分MySQL的關鍵字與普通字符,比如想要用 desc 作列名,就可以加反引號 |
SELECT後面一定有FROM嗎?
數據庫類型 | SELECT後面一定有FROM嗎? |
---|---|
Oracle | SELECT後面 一定要有 FROM,否則會報錯ORA-00923:未找到要求的 FROM 關鍵字 。如果沒有實際的查詢表,可以把 dual 表放到FROM後面。dual 是Oracle系統內部提供的一個用於實現臨時數據計算的特殊表,它只有一行一列。可以select * from dual; 試一下。 |
MySQL | SELECT後面 可以沒有 FROM |