天天看點

MySQL資料類型

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