MySQL 欄位類型總結

來源:互聯網
上載者:User

MySQL中各種欄位的取值範圍

時間:2005-09-29 20:59:14  來源:techtarget.com.cn  作者:techtarget.com.cn

 

  TINYINT

  -128 - 127

  TINYINT UNSIGNED

  0 - 255

  SMALLINT

  -32768 - 32767

  SMALLINT UNSIGNED

  0 - 65535

  MEDIUMINT

  -8388608 - 8388607

  MEDIUMINT UNSIGNED

  0 - 16777215

  INT 或 INTEGER

  -2147483648 - 2147483647

  INT UNSIGNED 或 INTEGER UNSIGNED

  0 - 4294967295

  BIGINT

  -9223372036854775808 - 9223372036854775807

  BIGINT UNSIGNED

  0 - 18446744073709551615

  FLOAT

  -3.402823466E+38 - -1.175494351E-38

  0

  1.175494351E-38 - 3.402823466E+38

  DOUBLE 或 DOUBLE PRECISION 或 REAL

  -1.7976931348623157E+308 - -2.2250738585072014E-308

  0

  2.2250738585072014E-308 - 1.7976931348623157E+308

  DECIMAL[(M,[D])] 或 NUMERIC(M,D)

  由M(整個數位長度,包括小數點,小數點左邊的位元,小數點右邊的位元,但不包括負號)和D(小數點右邊的位元)來決定,M預設為10,D預設為0

  DATE

  1000-01-01 - 9999-12-31

  DATETIME

  1000-01-01 00:00:00 - 9999-12-31 23:59:59

  TIMESTAMP

  1970-01-01 00:00:00 - 2037年的某天(具體是哪天我也不知道,呵呵)

  TIME

  -838:59:59' to 838:59:59

  YEAR[(2|4)]

  預設為4位格式,4位格式取值範圍為1901 - 2155,0000,2位格式取值範圍為70-69(1970-2069)

  CHAR(M) [BINARY] 或 NCHAR(M) [BINARY]

  M的範圍為1 - 255,如果沒有BINARY項,則不分大小寫,NCHAR表示使用預設的字元集.在資料庫中以空格補足,但在取出來時末尾的空格將自動去掉.

  [NATIONAL] VARCHAR(M) [BINARY]

  M的範圍為1 - 255.在資料庫中末尾的空格將自動去掉.

  TINYBLOB 或 TINYTEXT

  255(2^8-1)個字元

  BLOB 或 TEXT

  65535(2^16-1)個字元

  MEDIUMBLOB 或 MEDIUMTEXT

  16777215 (2^24-1)個字元

  LONGBLOB 或 LONGTEXT

  4294967295 (2^32-1)個字元

  ENUM('value1','value2',...)

  可以總共有65535個不同的值

  SET('value1','value2',...)

 

 

 

-------------------------------------------------------------------

 

 

 

讓 MySQL 的 TimeStamp 列不要自動更新

 

MySQL 有一種 timestamp 列類型,可以自動為該列插入目前時間戳,當 Update 語句執行時,該時間戳記也會自動更新。但有的時候,並不希望在更新時該值也自動更新,那該怎麼辦呢?

其實也很簡單,timestamp 自身支援這種設定。

當建立 timestamp 列時,一般的語句為:

create table tablename ( datecolname timestamp not null , ……..)

其實該語句的完整語句為:

create table tablename (datecolname timestamp not null default current_timestamp on update current_timetamp, ……..)

如果你想讓行值發生變化時時間戳記不要自動更新,可以使用以下語句:

create table tablename(datecolname timestamp not null default current_timestamp, ……..)

問題的關鍵就在於有 default current_timestamp 語句而沒有 on update current_timestamp 語句。

在 MySQL Query Browser 中建立表結構時,如果不想讓 timestamp 自動更新,記得一定要手動輸入 default 為 current_timestamp ,這樣 MySQL Query Browser 就會自動產生合適的 SQL 陳述式來建立表結構了。

 

 

------------------------------------------------

 

mysql TIMESTAMP列類型詳解  

mysql目前不支援列的default 為函數的形式,
如達到你某列的預設值為當前更新日期與時間的功能,
你可以使用timestamp列類型
下面就詳細說明timestamp列類型

timestamp列類型
timestamp值可以從1970的某時的開始一直到2037年,精度為一秒,其值作為數字顯示。
timestamp值顯示尺寸的格式如下表所示:

+---------------+----------------+
| 列類型        | 顯示格式       |
| timestamp(14) | yyyymmddhhmmss | 
| timestamp(12) | yymmddhhmmss   |
| timestamp(10) | yymmddhhmm     |
| timestamp(8)  | yyyymmdd       |
| timestamp(6)  | yymmdd         |
| timestamp(4)  | yymm           |
| timestamp(2)  | yy             |
+---------------+----------------+
“完整”timestamp格式是14位,但timestamp列也可以用更短的顯示尺寸創造
最常見的顯示尺寸是6、8、12、和14。
你可以在建立表時指定一個任意的顯示尺寸,但是定義列長為0或比14大均會被強制定義為列長14。
列長在從1~13範圍的奇數值尺寸均被強製為下一個更大的偶數。

列如:
定義欄位長度     強制欄位長度
timestamp(0) ->  timestamp(14)
timestamp(15)->  timestamp(14)
timestamp(1) ->  timestamp(2)
timestamp(5) ->  timestamp(6)

所有的timestamp列都有同樣的儲存大小,
使用被指定的時期時間值的完整精度(14位)儲存合法的值不考慮顯示尺寸。
不合法的日期,將會被強製為0儲存
這有幾個含意:
    1、雖然你建表時定義了列timestamp(8),但在你進行資料插入與更新時timestamp列
           實際上儲存了14位的資料(包括年月日時分秒),
           只不過在你進行查詢時mysql返回給你的是8位的年月日資料。
           如果你使用alter table拓寬一個狹窄的timestamp列,以前被“隱蔽”的資訊將被顯示。
    2、同樣,縮小一個timestamp列不會導致資訊失去,除了感覺上值在顯示時,較少的資訊被顯示出。
    3、儘管timestamp值被儲存為完整精度,直接操作儲存值的唯一函數是unix_timestamp();
           由於mysql返回timestamp列的列值是進過格式化後的檢索的值,
           這意味著你可能不能使用某些函數來操作timestamp列(例如hour()或second()),
           除非timestamp值的相關部分被包含在格式化的值中。
           例如,一個timestamp列只有被定義為timestamp(10)以上時,timestamp列的hh部分才會被顯示,
           因此在更短的timestamp值上使用hour()會產生一個不可預知的結果。
    4、不合法timestamp值被變換到適當類型的“零”值(00000000000000)。(datetime,date亦然)       

你可以使用下列語句來驗證:
create table test ('id' int (3) unsigned auto_increment, 'date1' timestamp (8) primary key('id'));
insert into test set id = 1;
select * from test;
+----+----------------+
| id | date1          |
+----+----------------+
|  1 | 20021114       |
+----+----------------+
alter table test change 'date1' 'date1' timestamp(14);
select * from test;
+----+----------------+
| id | date1          |
+----+----------------+
|  1 | 20021114093723 |
+----+----------------+

 

你可以使用timestamp列類型自動地用當前的日期和時間標記insert或update的操作。
如果你有多個timestamp列,只有第一個自動更新。
自動更新第一個timestamp列在下列任何條件下發生:

   1、列值沒有明確地在一個insert或load data infile語句中指定。
   2、列值沒有明確地在一個update語句中指定且另外一些的列改變值。
       (注意一個update設定一個列為它已經有的值,
        這將不引起timestamp列被更新,
        因為如果你設定一個列為它當前的值,mysql為了效率而忽略更改。)
   3、你明確地設定timestamp列為null.
   4、除第一個以外的timestamp列也可以設定到當前的日期和時間,只要將列設為null,或now()。

create table test (
     'id' int (3) unsigned auto_increment,
     'date1' timestamp (14),
     'date2' timestamp (14),
      primary key('id')
      );

insert into test (id, date1, date2) values (1, null, null);
insert into test set id= 2;
+----+----------------+----------------+
| id | date1          | date2          |
+----+----------------+----------------+
|  1 | 20021114093723 | 20021114093723 |
|  2 | 20021114093724 | 00000000000000 |
+----+----------------+----------------+
->第一條指令因設date1、date2為null,所以date1、date2值均為目前時間
  第二條指令因沒有設date1、date2列值,第一個timestamp列date1為更新為目前時間,
    而二個timestamp列date2因日期不合法而變為“00000000000000”

update test set id= 3 where id=1;
+----+----------------+----------------+

Demo:

 

MYSQL中TIMESTAMP類型可以設定預設值,就像其他類型一樣。

1、自動UPDATE 和INSERT 到當前的時間:

表:

/*DDL Information For - test.t1*/

---------------------------------

Table   Create Table                                                                        

------  -------------------------------------------------------------------------------------

t1      CREATE TABLE `t1` (                                                                 

          `p_c` int(11) NOT NULL,                                                           

          `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

        ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                                              

資料:

1    2007-10-08 11:53:35

2    2007-10-08 11:54:00

insert into t1(p_c) select 3;

update t1 set p_c = 2 where p_c = 2;

資料:

1    2007-10-08 11:53:35

2    2007-10-08 12:00:37

3    2007-10-08 12:00:37

2、自動INSERT 到目前時間,不過不自動UPDATE。

表:

/*DDL Information For - test.t1*/

---------------------------------

Table   Create Table                                            

------  ---------------------------------------------------------

t1      CREATE TABLE `t1` (                                     

          `p_c` int(11) NOT NULL,                               

          `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 

        ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                  

資料:

insert into t1(p_c) select 4;

update t1 set p_c = 3 where p_c = 3;

1    2007-10-08 11:53:35

2    2007-10-08 12:00:37

3    2007-10-08 12:00:37

4    2007-10-08 12:05:19

3、一個表中不能有兩個欄位預設值是目前時間,否則就會出錯。不過其他的可以。

表:

/*DDL Information For - test.t1*/

---------------------------------

Table   Create Table                                                  

------  ---------------------------------------------------------------

t1      CREATE TABLE `t1` (                                           

          `p_c` int(11) NOT NULL,                                     

          `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,      

          `p_timew2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 

        ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                        

資料:

1    2007-10-08 11:53:35    0000-00-00 00:00:00

2    2007-10-08 12:00:37    0000-00-00 00:00:00

3    2007-10-08 12:00:37    0000-00-00 00:00:00

4    2007-10-08 12:05:19    0000-00-00 00:00:00

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.