MySQL之完整建表語句及數據類型


1.創建表的完整語法

create table 表名(
字段名稱 數據類型[(長度) 約束條件],
字段名稱 數據類型[(長度) 約束條件]
)  
必須的:字段名  數據類型  表名  
可選的:長度 約束條件         

長度用於設置數據的長度

數據類型也是一種約束
約束指的是除了數據類型外的額外的規范

如果添加的數據超過了指定的長度范圍,超出范圍的就丟棄;

注意: 字段名 和 表名  庫名  都不能是mysql的關鍵字 比如select from not.....  

 

 

2.數據類型   

為什么需要將數據分類?
      

  1.為了描述事物 更加准確
  2.描述起來更方便
  3.節省內存空間
     1  a  你
     utf8  下 5個字節
     1 a b c
     unicode 6個字節

    mysql支持的數據類型:
        整型

               ***      ***     ***    *****   ***
            tinyint smallint mediumint  int   bigint
字節數:       1(255)     2      3         4      8   

       

默認情況下整型是有符號的 需要用一個二進制位存儲符號
        給整型加上 約束 unsigned來表示無符號

    create table t7(id tinyint unsigned);
        如果數據超出范圍就盡可能保存最大的 例如 在無符號下 保存256  其實存的255
        如果有符號  例如 tinyint  保存-1280 其實存的是-128  是最小值

        修改嚴格模式:
        以上特性的出現是因為 mysql處於非嚴格模式
            查看當前模式  show variables like "sql_mode";

 

            修改為嚴格模式  set global sql_mode = "STRICT_TRANS_TABLES";
        嚴格模式下 如果值超出范圍就直接報錯,在一些版本中默認就是嚴格模式!

  設置完嚴格模式之后,重啟客戶端:

因為帶符號得tinyint最大支持127,所以直接報錯


            在我們的正常開發中,我們應該先判斷數據的正確性,沒有問題在發給數據庫

        怎么選擇: 得根據實際情況來判斷,能夠保存你的數據的最小類型

        長度限制對於整型的意義:
            create table t10(id int(1));
            insert into t10 value(5555555);
            select *from t10;
            發現這個數也存儲成功

            說明 這里長度指的不是存儲容量限制
            而是顯示的寬度
            如果你的數據超過了顯示寬度 有幾個顯示幾個
            如果不足 則補全到指定長度  得告訴它用什么來補全
            create table t13(id int(10) zerofill);

           總結 不是容量限制 而是 顯示寬度
                要限制顯示寬度
                 1.創建表時 給整型加上寬度
                 2.加上zerofill約束

 

 

浮點型: 小數型

分類: float *****  double **** decimal  *****
字節數:     4          8        不確定(手動指定)

給浮點設置寬度限制
float(m,d)
double(m,d)
decimal(m,d)

長度說明 *****
m表示 這個浮點數整體的長度
d表示 小數部分的長度
例如: float(5,3)  最大值: 99.999


區別 *****
相同點: 小數部分最大長度都是30
        float和double的最大長度為255
不同點: decimal的整體最大長度65
        精度不同
        double 比 float 精度高
        decimal 是准確的 不會丟失精度

 

如何選擇:你對精確度要求高你就使用 decimal

 

字符型
分類
char  定長,簡單粗暴,浪費空間,存取速度快
varchar 變長,精准,節省空間,存取速度慢

char類型的長度是固定 無論你存儲的數據有多長 占用的容量都一樣
char(3)  存儲的數據為 "a"   在硬盤保存的數據還是占3字符長度  實際保存的是"a  "
varchar 長度是可變的 存儲的數據有多長就占用多長
varchar(3)  存儲的數據為 "a" 在硬盤保存的數據還是占1字符長度  實際保存的是"a"
yxx exx lxx zxx cx wxx   char(3)
(1bytes+yx)(1bytes+exx)(1bytes+lx)(1bytes+zxx)  varchar(3)
如果是可變長度 則有問題 不知道數據從哪里開始到哪里結束  所以需要有一個位置保存數據的長度
vharchar 能支持的最大長度是65535  用於保存數據長度的數據最長兩個bytes


如果是char類型  如果你的數據不足指定長度 就在后面用空格補全

驗證:
    使用一個 char_length的函數 可以查看字符的長度
    create table t18(a char(4),b varchar(4));
    insert into t18 value("x","x");
    select char_length(a),char_length(b) from t18;
    兩個字段的長度都為1

    結論:
    這是因為 mysql在存儲時 自動加上的空格 對使用者而言是沒有意義的 所以mysql自動幫你處理掉空格了
    我們可以設置sql模式 來讓它現出原形
    set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
    設置完成后重啟msyql 再次查詢長度

 

    注意:
    當你在執行這樣的查詢語句時  mysql會自動將參數末尾的空格去除
    select *from t18 where  name = "a"


    當你在使用模糊搜索時 要注意 定長字符 后面可能會有空格 所以最好在后面加上百分號 %
    select *from t18 where  name like "a";
        % 任意個數的任意字符
        _ 1個任意字符

 

如何選擇
    char
        存取效率高
        浪費存儲空間
    varchar
        存取效率低於char
        節省存儲空間
    使用起來感受不到區別 通常用的是char

 

char和varchar 長度都比較小 最大就是65535

    大文本類型:
    TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT     文本是帶有編碼
    BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符數據 但是不帶編碼

    二進制類型: 用於存儲多媒體數據 比如視頻   但是我們一般不會將多媒體數據存到數據 而是存儲文件路徑地址
    BINARY系列 BINARY VARBINARY    存儲二進制數據

 

 

分類
time   時分秒   HH:MM:SS   

year   年份     
date   日期  年月日   
datetime 日期加時間 年月日 時分秒     年份最大是9999    
timestamp 時間戳  從1970-1-1開始算    年份最大是2037    

 


共同點: 時間的存取通過字符串類型
        都可以使用now()函數來插入當前時間


datetime 和 時間戳都能夠表示日期和時間
不同之處是: 年份最大范圍不同
            時間戳可以為空 代表當前時間
            時間戳在你更新記錄時 會自動更新為當前時間

 

 

 

枚舉  
    用於描述 一個已知范圍的數據 例如性別: 只有男 女 或其他
    enum("man","woman","other")

    總結: 枚舉中只能是字符串類型
          添加的數據只能是已經出現在枚舉中的值
          你的值只能是其中的一個
          你也可以使用枚舉值的序號來插入值 從1開始
           多選1


集合 
    用於描述一堆數據  比如你的興趣愛好
    set("watch movie","listen music","play game")

    總結:集合中的數據 只能是字符串
         添加的數據只能是已經出現在集合中的值
         你的值可以是其中的任意幾個
         你也可以使用枚舉值的序號來插入值 從1開始   但是只能給一個序號
           多選多

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM