1. 程式人生 > 其它 >MySQL資料型別(r3筆記第87天)

MySQL資料型別(r3筆記第87天)

今天在本地裝了一個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

4 位元組

(-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

8 位元組

(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的值

依賴於M和D的值

小數值

-->字元型別

型別

大小

用途

CHAR

0-255位元組

定長字串

VARCHAR

0-255位元組

變長字串

TINYBLOB

0-255位元組

不超過 255 個字元的二進位制字串

TINYTEXT

0-255位元組

短文字字串

BLOB

0-65 535位元組

二進位制形式的長文字資料

TEXT

0-65 535位元組

長文字資料

MEDIUMBLOB

0-16 777 215位元組

二進位制形式的中等長度文字資料

MEDIUMTEXT

0-16 777 215位元組

中等長度文字資料

LOGNGBLOB

0-4 294 967 295位元組

二進位制形式的極大文字資料

LONGTEXT

0-4 294 967 295位元組

極大文字資料

-->日期型別

型別

大小(位元組)

範圍

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

'-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

8

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個位元組。這樣的話mysql中一個漢字佔三個位元組,Oracle中一個漢字佔兩個位元組。 對於lob型別,最大支援長度和oracle一致。都是4G的樣子。MySQL中分得比較細,比較靈活。 -->日期型別 對於日期型別,可能Oracle支援得更廣一些,型別分得更細。考慮了timezone的部分。不過大部分使用來說基本沒什麼差別,我目前還沒有用到timezone相關的資料型別。

Datatype

Time Zone

Fractional Seconds

DATE

No

No

TIMESTAMP

No

Yes

TIMESTAMP WITH TIME ZONE

Explicit

Yes

TIMESTAMP WITH LOCAL TIME ZONE

Relative

Yes

順帶說一句,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
                             *
ERROR at line  1:
ORA-00911: invalid character

mysql> select  current_date;select current_date;   --mysql裡面就可以很輕巧的實現
+--------------+
| current_date  |
+--------------+
| 2014-12-17   |
+--------------+
1 row in set  (0.00 sec)


+--------------+
| current_date  |
+--------------+
| 2014-12-17   |
+--------------+
1 row in set  (0.00 sec)