1. 程式人生 > 實用技巧 >三、資料類和運算子

三、資料類和運算子

  資料型別描述使用以下約定:

    • 對於整數型別,M表示最大顯示寬度。對於浮點和定點型別, M是可以儲存的總位數(精度)。對於字串型別, M是最大長度。的最大允許值M取決於資料型別。

    • D適用於浮點和定點型別,並指示小數點後的位數(小數位數)。可能的最大值是30,但不應大於 M-2。

    • fsp適用於 TIME, DATETIME和 TIMESTAMP型別和表示小數精度秒; 也就是說,小數點後的位數是秒的小數部分。fsp如果給出值,則該值必須在0到6的範圍內。值0表示沒有小數部分。如果省略,則預設精度為0。(這與標準SQL預設值6不同,以便與以前的MySQL版本相容。)

    • 方括號([和])表示型別定義的可選部分。

一、資料型別介紹

1.1、數值資料型別

  • 整數型別(精確值)
    數值型資料主要用來存數字。整數型別的屬性欄位可以新增AUTO_INCREMENT自增約束條件。
型別名稱儲存空間(位元組)取值範圍
TINYINT 1個位元組。 0-255
SMALLINT 2個位元組 0-65535
MEDIUMINT 3個位元組 0-16777215
INT(INTEGER) 4個位元組。 0-4294967295
BIGINT(大整數) 8個位元組。 0-18446744073709551615

  INT(11)這11表示的是該資料型別指定的顯示寬度,數值的位數小於指定的寬度時,會由空格填充,如果插入大於顯示寬度,只要該值不超過該型別整數的取值範圍,數值依然可以插入而且能夠顯示出來

  • 定點數型別(精確值)
    DECIMALNUMERIC 型別的儲存精確的數值資料。當保留精確度很重要時,例如使用貨幣資料。

DECIMAL(M,N)。

  浮點型別和定點型別都可以用(M,N)來表示,其中M稱為精度,表示總共的位數;N稱為標度,是表示最小數的位數。

salary DECIMAL5,2

  5是精度, 2是小數位數。精度表示值儲存的有效位數,小數位數表示小數點後可以儲存的位數。標準SQL要求DECIMAL(5,2)能夠儲存具有五位數字和兩位小數的任何值,因此可以儲存在salary 列中的值的範圍是從-999.99到 999.99。

  浮點數型別和定點數型別

    • 浮點數分為兩種:
      • 單精度浮點型別(FLOAT(M,N))
      • 單精度浮點型別(FLOAT(M,N))
    • 在MySQL中,定點數以字串形式儲存,在對精度要求比較高的時候(如貨幣,科學資料等)使用DECIMAL的型別比較好。另外兩個浮點數進行減法和比較運算時也容易出問題,所以在使用浮點型時要注意

1.2、日期與時間型別

  • YEAR
    YEAR儲存時只需要一個位元組
    • 以4位字串或者4位數字格式表示YEAR 範圍為 1901~2155。  
    • 以2位字串表示 "00"~"69" 代表2000~2069 "70"~"99"代表1970~1999
CREATE TABLE year_test(yt YEAR);
INSERT INTO year_test VALUES(1925);
INSERT INTO year_test VALUES(33);
INSERT INTO year_test VALUES(88);
SELECT * FROM year_test;

  • TIME
    TIME型別用於只需要時間資訊的值,在儲存時需要3個位元組。格式HH:MM:SS的字元TIME型別的取值範圍為-838:59:59~838:59:59,TIME型別不僅可以用於表示一天的時間,還可是兩個事件之間的時間間隔。TIME可以是“HHMMSS”格式的、間隔的字串,或者,HHMMSS格式的資料,假定是有意義的時間。
    TIME分配簡寫值時注意啊,例如數值1122如果沒有冒號,MySQL解釋值時,假定最右邊的兩位是秒,解釋為過去的時間1122 解釋為 0:11:22。如果有冒號則解釋為當天的時間則解釋為11:22:00

-- 建表
CREATE TABLE timetest(t time);

-- 插入資料

insert into timetest VALUES('10:05:05'),('23:23'),('2 10:10'),('3 02'),('10');

-- 查詢
SELECT * FROM timetest

  • DATE
    DATE型別用在僅需要日期值時,沒有時間部分,在儲存時需要3個位元組。在給DATE型別的欄位賦值時,可以使用字串**型別或者數字型別的資料插入,但要符合DATE的日期格式。

--格式:
--字串型別 “”、“”、“”、“”
-- 數字型別YY-MM-DD 或者YYMMDD

CREATE TABLE datetest(datatest DATE);

INSERT INTO datetest VALUES('2019-08-12'),('20190812'),('190812'),(CURRENT_DATE),(NOW());

SELECT * FROM datetest

  • DATETIME

    DATETIME型別用在需要同時包含日期和時間資訊的值,儲存時需要8個位元組,格式YYYY-MM-DD HH:MM:SS,在給DATETIME型別的欄位賦值時,可以使用字串型別或者數字型別的資料插入

    MySQL允許“不嚴格”語法。任何標點符號都可以用作日期部分或者時間部分之間的間隔符。

  • TIMESTAMP
    TIMESTAMP的顯示格式與DATETIME相同,但是TIMESTAMP列的取值範圍小於DATETIME的取值範圍。 DATETIME儲存日期資料時,按實際輸入的格式儲存,與時區無關,而TIMESTAMP值的儲存時以UTC格式儲存的,儲存時對當前時區進行轉換,檢索時再轉回當前時區。就是說,查詢時,根據當前時區的不同,顯示的時間值不同。

1.3、文字字串型別

  字串型別除了儲存字串資料外,還可以儲存比如圖片、聲音的二進位制資料。MySQL中支援兩類字串資料:文字字串、二進位制字串。 MySQl中文字字串有:CHAR、VARCHAR、TEXT、ENUM、SET。VARCHAR和TEXT型別是變長型別,對於其儲存需求取決於列值的實際長度,而不是取決於型別的最大可能尺寸。

  • CHAR和VARCHAR
    • CHAR(M)固定長度字串,在定義時指定字串列長。當儲存時在右側填充空格以達到指定的長度。M(0-255)表示類長度。當檢索CHAR值時,尾部的空格被刪除。
    • VARCAHR(M)長度可變的字串,M(0-65535)表示最大列長度。M的返回時0~65535。VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定,而其實際上佔用的空間為字串的實際長度+1.VARCHAR在值儲存和檢索時尾部的空格仍保留。
    • 例如VARCHAR(50)定義一個最大長度為50的字串,如果插入的字串只有10個字元,則實際儲存的的字串為10個字元和一個字串結束字元,VARCHAR在值的儲存和檢索時尾部的空格扔保留。

CREATE TABLE char_test(charColumn CHAR(4));

INSERT INTO char_test VALUES('abcde');

char /varchar型別列插入的數值如果超過定義是指定的長度,插入不進去

  • TEXT型別
    儲存如文章內容,評論等。當儲存或查詢時,不刪除尾部空格。

  • ENUM型別
    是一個字串物件,其值在建立時再列規定中列舉一個值。

-- 語法:欄位名 ENUM ('值1','值2','值3'......)
create table enum_test(e enum('1','2','3'));

  ENUM型別的欄位在取值時,只能在制定的列舉列表中取(insert的值的列舉的索引),而且一次只能去一個,如果建立的成員中有空格時,其尾部的空格將自動被刪除,ENUM值在內部用整數表示,每一個列舉值均有一個索引,列表值所允許的成員值從1開始編號。ENUM值一種列索引順序排列,並且空字串排在非空字串前,NULL值排在其他所有列舉值前

  • SET型別
    SET是一個字串物件,可以有零個或多個值,最多可以有64個成員。
-- 語法:欄位名 SET('值1','值2','值3'.....'值n')
 create table set_test(st set('1','2','3'));

ENUMSET
相同 內部用整數表示,列表中每一個值有一個索引編號。當建立表時,SET成員值的尾部空格將會自動刪除 內部用整數表示,列表中每一個值有一個索引編號。當建立表時,SET成員值的尾部空格將會自動刪除
不同 ENUM型別欄位只能從定的列中選擇一個值插入 SET型別的列可以從定義的列值中選擇多個字元,如果插入SET欄位中的列值重複,則MySQL自動刪除重複的值,插入SET欄位值的順序並並不重要,MySQL會在存入資料時,按照定義的順序顯示。

1.4、二進位制字串型別

  • BIT型別
    BIT型別是位欄位型別。M表示每個值的位數,範圍為1~64如果M省略,預設為1.如果為BIT(M)列分配的值的長度小於M位,在值的左邊用0填充。
  • BINARY和VARBINARY型別

-- 列名稱  BINNARY(M)或者 VARBINARY(M)
BINNARY 長度固定,不足長度右邊用\0補齊
VARBINARY長度可變

  • BLOB
    是一個二進位制大物件,用來儲存可變數的資料。

二、如何選擇資料型別

2.1、CHAR 和VARCHAR之間的選擇

  • 區別
    CHAR是固定長度字元,VARCHAR是可變長度字元。 檢索時CHAR會自動刪除插入資料的尾部空格,VARCHAR不會刪除尾部空格 CAHR是固定長度,索引它的處理速度比VARCHAR的速度快,但是缺點就是浪費空間,對儲存不大,速度有要求的則用CHAR反之用VARCHAR

  • 儲存引擎對CHAR和VARCAHR的影響
    對於MyISAM儲存引擎:最好使用固定長度的資料列代替可變長度的資料列。這樣可以是整個表靜態化,從而使資料檢索更快,用空間換時間 對於MyISAM儲存引擎:最好使用固定長度的資料列代替可變長度的資料列。這樣可以是整個表靜態化,從而使資料檢索更快,用空間換時間

2.2、ENUM 和SET

  ENUM 是儲存在多選一型別 SET是多選多型別 ENUM和SET的值是一字串形式出現的,但在內部,MySQL以數值的形式儲存。

2.3、BLOB和TEXT

  都是儲存大容量資訊的。BLOB主要儲存圖片、音訊檔案。TEXT只能儲存純文字

三、比較運算子

  1. 等於運算子 等號用來判斷數字、字串、和表示式是否相等。相等返回1 不等返回0;比較字串 不區分大小 寫,不能用空值NULL的判斷。

  2. 完全等於<=> 比等於加個判空處理,兩邊都為空則返回1,否則0。

  3. 不等於 != 後者<> 用來判斷數字、字串、和表示式是否不相等,相等返回0 不等返回1

  4. ISNUll和IS NOT NULL 檢驗值是否為空

  5. BETWEEN..AND...

  6. LEAST語法 LEAST(值1,值2,......,值n);返回最小值。

  7. GREATEST(值1,值2,.....);返回最大值。

  8. IN 、NOT IN

  9. LIKE

  10. REGEXP用來匹配字串 expr REGEXP 匹配條件 萬用字元

    • ^ 匹配以該字元後面字元開頭的字串、

    • $ 匹配以該字元後面的字元結尾的字串。

    • .匹配任意單個字元

    • [...] 匹配在方括號內的任意字元。[abc] 匹配a,b,c[a-z]匹配任一字母,[0-9]匹 配任意數字

    • 匹配零個多多個在他前面的字元。例如X,匹配人一多個X.[0-9]*,匹配任意多個數字。

在MySQL中需要輸入特殊符號如單引號、雙引號、或者反斜線時注意使用轉義字元\