06. MySQL的資料型別

N_xiaoying發表於2020-11-13

1. 整型

  • 一個無符號數一定是非負數
    create table t3(
    age tinyint unsigned
    );

     

  • 顯示寬度 (zerofill) 整型顯示寬度, 位數不足時用 0 填充

    create table t4(
    id int(10) zerofill primary key auto_increment,
    name char(32)
    );
    insert into t4 values(12345, '5個');
    insert into t4 values(1234567890, '10個');
    insert into t4 values(123456789012, '12個');‐‐‐》越界
    select * from t4;

     

2. 浮點型

定點數的位數更加長 使用方式:

  • float(M,D)
  • double(M,D)
  • decimal(M,D)
  • M 是支援多少個長度, D 是小數點後面的位數
create table t5 (
a float(10, 2),
b double(10, 2),
c decimal(10, 2)
);

3. 字串型別

CHAR 與 VARCHAR 型別的區別

字串、浮點型等都可以隨意指定大小, 那麼是不是平時操作的時候隨意指定一個就可以呢?

答:不是, 資料型別並不是越大越好, 越大的型別會造成資料臃腫, 儲存空間佔用過大, 資料檢索也會變慢

4. 列舉(enum)

多選一的時候使用的一種資料型別

在前端使用單選框的時候, 列舉型別可以發揮作用

列舉型別的優點:

  1. 限制了可選值
  2. 節省空間
  3. 執行效率高
    create table t6(
    name varchar(32),
    sex enum('男','女','保密') default '保密'
    );
    ‐‐ 列舉型別的計數預設從1開始
    insert into t6 set name='南鄉',sex=1;
    insert into t6 values('南鄉',1);


     

5. 集合(set)

SET最多可以有64個不同的成員。類似於核取方塊, 有多少可以選多少。

create table t7 (
name varchar(32),
hobby set('吃','睡','玩','喝','抽')
);
insert into t7 values('張三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');
  • 為什麼不是用 set 型別?
    在現代網站開發中, 多選框的值有上千個, 值儲存的空沒有索引用的多 
  • 那核取方塊的問題怎麼解決?
    將核取方塊的值單獨設計成一張表

6. 時間型別

6.1 datetime

create table datetime_test (
create_at datetime
);
insert into datetime_test values('2020‐11‐13 16:54:00');
insert into datetime_test values('2020/11/13 16:54:00');
insert into datetime_test values(now());
insert into datetime_test values('2019/4/2');  -- 預設時間是00:00:00
insert into datetime_test values('16:54:00');  -- 錯誤
‐‐ 年份最大支援4個長度
insert into datetime_test values('10000/4/2 16:54:00'); ‐‐ 錯誤
insert into datetime_test values('9999/4/2 16:54:00');

6.2 time

create table time_test (
create_at time
);
insert into time_test values('12:12:12');
insert into time_test values('100:12:12');
insert into time_test values('‐100:12:12');
insert into time_test values('10 10:12:12');
‐‐ 時間的範圍是: [‐838:59:59 ‐ 838:59:59]
insert into time_test values('839:12:12'); ‐‐ 錯誤的

6.3 timestamp 時間戳型別

  • 時間戳型別在顯示方面和datetime是一樣的, 在儲存上不一樣
  • 範圍從 1970-1-1 0:0:0 到 2038-1-19 11:14:07
  • 時間戳使用 4 個位元組表示
  • 該值大小與儲存的位長有關: 2 ** (4 * 8 - 1)
create table timestamp_test (
create_time timestamp
);
insert into timestamp_test values(now());
insert into timestamp_test values('2038‐1‐19 11:14:07'); ‐‐ 時間戳最大值
insert into timestamp_test values('2038‐1‐19 11:14:08'); ‐‐ 錯誤

6.4 year

create table `year`(
create_at year
);
‐‐ 從1900年開始 ‐ 1900+255
insert into `year` values(now());
insert into `year` values('2155'); ‐‐ 年份最大值
insert into `year` values('2156'); ‐‐ 錯誤

6.7 布林型

mysql中的bool型別也是1和0

create table `bool`(
cond boolean
);
insert into `bool` set cond=True; ‐‐ 成功
insert into `bool` set cond=False; ‐‐ 成功
insert into `bool` set cond=1; ‐‐ 成功
insert into `bool` set cond=10; ‐‐ 成功
insert into `bool` set cond=‐1; ‐‐ 成功
insert into `bool` set cond=0; ‐‐ 成功
insert into `bool` set cond=0.1; ‐‐ 成功
insert into `bool` set cond='True'; ‐‐ 失敗

6.8 列的屬性

  • 插入的值是否可以為空
    • null : 是可以為空,預設不寫
    • not null : 不可以為空,如果插入的時候,摸個欄位的值為空,則報錯
      create table null_test (
      id int primary key auto_increment,
      username varchar(32) not null,
      pwd varchar(16) null
      );
      insert into null_test values(null,null,null);

       

  • default
    預設值一般是和null做搭配的
    create table default_test (
    id int primary key auto_increment,
    username varchar(32) default 'admin' not null,
    pwd varchar(16) default 123456
    );
    insert into default_test (username) values ('admin');

     

  • auto_increment
    • 自動增長的列
    • 預設從 1 開始
    • 常配合主鍵使用的
      create table auto_inc (
      id int primary key auto_increment,
      name varchar(32)
      );
      insert into auto_inc (name) values ('aaa'), ('bbb'), ('ccc');
      select * from auto_inc;
      /* 輸出:
      +‐‐‐‐+‐‐‐‐‐‐+
      | id | name |
      +‐‐‐‐+‐‐‐‐‐‐+
      | 1 | aaa |
      | 2 | bbb |
      | 3 | ccc |
      +‐‐‐‐+‐‐‐‐‐‐+
      */

       

  • primary key
    • 主鍵一般是唯一的標識
    • 特性:不能為空,也不能重複,一張表當中只可以擁有一個主鍵
      ‐‐ 這裡只有一個主鍵,這種主鍵叫做聯合主鍵, 在專案中使用較少
      create table double_pri_test (
      id int,
      sid int,
      primary key(id,sid)
      );
      insert into double_pri_test values (1, 1);
      insert into double_pri_test values (1, 2); ‐‐ 成功
      insert into double_pri_test values (2, 1); ‐‐ 成功
      insert into double_pri_test values (1, 1); ‐‐ 失敗

       

  • unique
    • 唯一鍵,保證列當中的每一個資料都不重複
    • 郵箱不可以重複,手機號不可以重複
      create table test_uniq (
      id int auto_increment primary key,
      mobile char(11) unique
      );
      insert into test_uniq set mobile=13999999999;

       

  • comment
    • 欄位說明: 給開發者看的, 一般用來對相應欄位進行說明
      create table test_cmt (
      ctime datetime comment '這個欄位代表建立日期'
      );


       

6.9 SQL註釋

  • 單行註釋: -- 你好
  • 多行註釋: /*人類無聲無息地成為娛樂的附庸,
                       毫無怨言,甚至心甘情願,其結果是,
                       我們成了一個娛樂至死的物種。 */
  • MySQL 獨有的單行註釋: # 謙遜基於力量,高傲基於無能。

相關文章