1. 程式人生 > >Mysql中資料型別括號中的數字代表的含義

Mysql中資料型別括號中的數字代表的含義

我們平時用sql語句建資料庫的時候,總是會寫到int(11),varchar(200)。但是括號裡面的值具體代表什麼意思呢?我感覺我是’知其然而不知其所以然’。

首先,我們建立一個數據表test:

mysql> CREATE TABLE test(
    -> id1 int(1),
    -> id2 tinyint(1)
    ->);

這裡寫圖片描述

此處的有符號和無符號怎麼區別?
給一個欄位加上UNSIGNED屬性,該欄位型別就是帶符號的,比如tinyint,帶UNSIGNED屬性,這個欄位就可以存0~255的值,如果沒有UNSIGNED屬性,就只能存-128~127之間的值

上述表格中的數值型別都是定長的,也就是說,無論你存的數值是多少,多大或者多小,佔用的位元組大小都是固定的。例如,之前設定的int(1),雖然M值是1個字元,但是它所佔用的空間大小永遠都是4個位元組的大小,換句話說就是,你可以存入有符號整型從-2 147 483 648到2 147 483 647包括這兩個數的中間任何一個數。int(1)和int(11)佔用的是4個位元組,可以存入上述這些數,tinyint(1)和tinyint(4)佔用的是1個位元組,可以存入從-128到127的數,這也是為什麼之前的一次試驗,int(1)插入128成功,而tinyint(1)插入128卻提示超出長度。

那麼,這個M值到底代表什麼意思呢?

到這裡,我們已經可以發現,M值即使設定為1,它也可以存入字元長度大於1的值,那麼,如果存入的字元長度小於1會怎麼樣?我們來試一試:

先將id1的型別更改為int(2),然後插入資料id1=1:

mysql> ALTER TABLE test Modify id1 int(2);
mysql> INSERT INTO test(id1) values(1);//執行成功,說明值1已經插入到test表中
mysql> SELECT * FROM test;
+------+
|  id1 |
+------+
|   1  |
+------+
//接下來,我們再修改一下id1的填充資料型別zerofill(表示用0填充),這裡先知道如何操作即可,我們再從結果得出結論: mysql> ALTER TABLE test MODIFY id1 int(2) zerofill; mysql> SELECT * FROM test; +------+ | id1 | +------+ | 01 | +------+

現在是不是有些清楚了。我們設定的M值是2,沒有設定zerofill用0填充時,對於操作沒有任何影響,而設定了zerofill後,我們可以清楚地看到值1字元數不足M值,左前位置補0。我們也可以將M值設定成別的大小進行多次測試,這裡就不進行測試了。

需要強調的是,不同的資料型別中的M值意義是不一樣的,我們這裡僅討論整型中的M值。

從上面我們可以得到如下的結論:

1、整數型的數值型別已經限制了取值範圍,有符號整型和無符號整型都有,而M值並不代表可以儲存的數值字元長度,它代表的是資料在顯示時顯示的最小長度;

2、當儲存的字元長度超過M值時,沒有任何的影響,只要不超過數值型別限制的範圍;

3、當儲存的字元長度小於M值時,只有在設定了zerofill用0來填充,才能夠看到效果,換句話就是說,沒有zerofill,M值就是無用的。

總結:int(11),tinyint(1),bigint(20),後面的數字,不代表佔用空間容量。而代表最小顯示位數。這個東西基本沒有意義,除非你對欄位指定zerofill。

所以我們在設計mysql資料庫時,建表時,mysql會自動分配長度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。

所以,就用這些預設的顯示長度就可以了。不用再去自己填長度,比如搞個int(10)、tinyint(1)之類的,基本沒用。而且導致表的欄位型別多樣化。

字元和位元組的概念。

位元組(Byte)是一種計量單位,表示資料量多少,它是計算機資訊科技用於計量儲存容量的一種計量單位。

字元是指計算機中使用的文字和符號,比如1、2、3、A、B、C、~!·#¥%……—*()——+、,中,國等等。

字元和位元組不存在絕對的關係,只是在不同的編碼格式裡,對應的比值不一樣。比如:

1.UTF-8編碼中,一個英文字元等於一個位元組,一箇中文(含繁體)字元等於三個位元組。

2.Unicode編碼中,一個英文等於兩個位元組,一箇中文(含繁體)字元等於兩個位元組。

符號:英文標點佔一個位元組,中文標點佔兩個位元組。舉例:英文句號“.”佔1個位元組的大小,中文句號“。”佔2個位元組的大小。

3.UTF-16編碼中,一個英文字母字元或一個漢字字元儲存都需要2個位元組(Unicode擴充套件區的一些漢字儲存需要4個位元組)。

4.UTF-32編碼中,世界上任何字元的儲存都需要4個位元組。

所有你看見的單個字:a,啊,都叫字元。