今天在本地裝了一個MySQL的學習環境,簡單的熟悉了一下。準備開始好好學習MySQL了。
學習程式設計語言我都是從資料類型入手。每種程式設計語言的資料類型都有自己的特點,有點簡單,有的種類豐富。
總體感覺而言,MySQL的資料類型要比oracle豐富的多。用慣了oracle中的資料類型,一般number,varchar2,date就足夠了,最常用的這3個資料類型在MySQL就有着巨大的變化,還是有點不适應。
MySQL中的資料類型都會和你“斤斤計較“,非常的細緻,都在基本資料類型的範圍内。oracle中的資料類型的次元要廣。在http://blog.itpub.net/23718752/viewspace-1339501/中有過一些簡單的總結。
以下表格内容都來自http://www.w3cschool.cc/mysql/mysql-data-types.html,總結得已經很詳細了。
-->數值類型
類型
大小
範圍(有符号)
範圍(無符号)
用途
TINYINT
1 位元組
(-128,127)
(0,255)
小整數值
SMALLINT
2 位元組
(-32 768,32 767)
(0,65 535)
大整數值
MEDIUMINT
3 位元組
(-8 388 608,8 388 607)
(0,16 777 215)
INT或INTEGER
4 位元組
(-2 147 483 648,2 147 483 647)
(0,4 294 967 295)
BIGINT
8 位元組
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615)
極大整數值
FLOAT
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)
0,(1.175 494 351 E-38,3.402 823 466 E+38)
單精度
浮點數值
DOUBLE
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
雙精度
DECIMAL
對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2
依賴于M和D的值
小數值
-->字元類型
CHAR
0-255位元組
定長字元串
VARCHAR
變長字元串
TINYBLOB
不超過 255 個字元的二進制字元串
TINYTEXT
短文本字元串
BLOB
0-65 535位元組
二進制形式的長文本資料
TEXT
長文本資料
MEDIUMBLOB
0-16 777 215位元組
二進制形式的中等長度文本資料
MEDIUMTEXT
中等長度文本資料
LOGNGBLOB
0-4 294 967 295位元組
二進制形式的極大文本資料
LONGTEXT
極大文本資料
-->日期類型
(位元組)
範圍
格式
DATE
3
1000-01-01/9999-12-31
YYYY-MM-DD
日期值
TIME
'-838:59:59'/'838:59:59'
HH:MM:SS
時間值或持續時間
YEAR
1
1901/2155
YYYY
年份值
DATETIME
8
1000-01-01 00:00:00/9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
混合日期和時間值
TIMESTAMP
1970-01-01 00:00:00/2037 年某時
YYYYMMDD HHMMSS
混合日期和時間值,時間戳
是以在oracle我們常使用的number,基本可以使用int來代替了。
在oracle中通過number能夠控制資料的精度,比如我們制定Number(2),那麼你如果數值過界了,就會直接報錯。支援的資料範圍精度也很高。可能在MySQL中會基于資料類型有對應的存儲特性吧。
SQL> create table test (id number(2));
Table created.
SQL> insert into test values(127);
insert into test values(127)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
在MySQL中嘗試,按照tinyint的最大值127,我們輸入128,會直接插入127,沒有報錯,有警告。
mysql> create table test(id tinyint);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into test values(128);
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> select*from test;
+------+
| id |
| 127 |
1 row in set (0.00 sec)
關于這個資料類型,對于varchar2是最不适應了。MySQL的varchar類型和oracle的varchar2使用是類似的。一個不同支援是MySQL支援的字元長度要小一些,隻有256位元組。
mysql中varchar(6)代表可以存放6個漢字,6個字母,或6個數字。
oracle中varchar2(6)代表可以中存放6個位元組。采用utf8編碼,oracle中一個漢字占用3個位元組。
對于lob類型,最大支援長度和oracle一緻。都是4G的樣子。MySQL中分得比較細,比較靈活。
對于日期類型,可能Oracle支援得更廣一些,類型分得更細。考慮了timezone的部分。不過大部分使用來說基本沒什麼差别,我目前還沒有用到timezone相關的資料類型。
Datatype
Time Zone
Fractional Seconds
No
Yes
TIMESTAMP WITH TIME ZONE
Explicit
TIMESTAMP WITH LOCAL TIME ZONE
Relative
順帶說一句,oracle和mysql中都可以使用current_date,current_timestamp。
SQL> select current_date from dual;
CURRENT_DATE
------------------
17-DEC-14
SQL> select current_date from dual; select current_date from dual; --oracle中不能并行運作兩個查詢
select current_date from dual; select current_date from dual
*
ORA-00911: invalid character
mysql> select current_date;select current_date; --mysql裡面就可以很輕巧的實作
+--------------+
| current_date |
| 2014-12-17 |
1 row in set (0.00 sec)