1. 程式人生 > >08 資料型別(2)

08 資料型別(2)

本節重點

  • 掌握char型別和varchar型別
  • 掌握列舉型別和集合型別

 

 

字元型別

複製程式碼
#官網:https://dev.mysql.com/doc/refman/5.7/en/char.html
#注意:char和varchar括號內的引數指的都是字元的長度

#char型別:定長,簡單粗暴,浪費空間,存取速度快
    字元長度範圍:0-255(一箇中文是一個字元,是utf8編碼的3個位元組)
    儲存:
        儲存char型別的值時,會往右填充空格來滿足長度
        例如:指定長度為10,存>10個字元則報錯,存<10個字元則用空格填充直到湊夠10個字元儲存

    檢索:
        在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們開啟pad_char_to_full_length SQL模式(設定SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
      查詢sql的預設模式:select @@sql_mode;) #varchar型別:變長,精準,節省空間,存取速度慢 字元長度範圍:0-65535(如果大於21845會提示用其他型別 。mysql行最大限制為65535位元組,字元編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 儲存: varchar型別儲存資料的真實內容,不會用空格填充,如果'ab ',尾部的空格也會被存起來 強調:varchar型別會在真實資料前加1-2Bytes的字首,該字首用來表示真實資料的bytes位元組數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大位元組限制,即已經足夠使用) 如果真實的資料<255bytes則需要1Bytes的字首(1Bytes=8bit 2**8最大表示的數字為255) 如果真實的資料>255bytes則需要2Bytes的字首(2Bytes=16bit 2**16最大表示的數字為65535) 檢索: 尾部有空格會儲存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容
複製程式碼

官網解釋如下:

驗證:

驗證之前瞭解兩個函式:

length():檢視位元組數
char_length():檢視字元數

 

1.char填充空格來滿足固定長度,但是在查詢時卻會很不要臉地刪除尾部的空格(裝作自己好像沒有浪費過空間一樣),然後修改sql_mode讓其現出原形。

複製程式碼
# 建立t1表,分別指明欄位x為char型別,欄位y為varchar型別
mysql> create table t1(x char(5),y varchar(4));
Query OK, 0 rows affected (0.16 sec)

# char存放的是5個字元,而varchar存4個字元
mysql>  insert into t1 values('你瞅啥 ','你瞅啥 ');
Query OK, 1 row affected (0.01 sec)

# 在檢索時char很不要臉地將自己浪費的2個字元給刪掉了,裝的好像自己沒浪費過空間一樣,而varchar很老實,存了多少,就顯示多少
mysql> select x,char_length(x),y,char_length(y) from t1;
+-----------+----------------+------------+----------------+
| x         | char_length(x) | y          | char_length(y) |
+-----------+----------------+------------+----------------+
| 你瞅啥    |              3 | 你瞅啥     |              4 |
+-----------+----------------+------------+----------------+
1 row in set (0.02 sec)

 #略施小計,讓char現原形
 mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)

#檢視當前mysql的mode模式
mysql> select @@sql_mode;
+-------------------------+
| @@sql_mode              |
+-------------------------+
| PAD_CHAR_TO_FULL_LENGTH |
+-------------------------+
1 row in set (0.00 sec)

#原形畢露了吧。。。。
mysql> select x,char_length(x) y,char_length(y) from t1;
+-------------+------+----------------+
| x           | y    | char_length(y) |
+-------------+------+----------------+
| 你瞅啥      |    5 |              4 |
+-------------+------+----------------+
1 row in set (0.00 sec)

# 檢視位元組數
#char型別:3箇中文字元+2個空格=11Bytes
#varchar型別:3箇中文字元+1個空格=10Bytes
mysql> select x,length(x),y,length(y) from t1;
+-------------+-----------+------------+-----------+
| x           | length(x) | y          | length(y) |
+-------------+-----------+------------+-----------+
| 你瞅啥      |        11 | 你瞅啥     |        10 |
+-------------+-----------+------------+-----------+
1 row in set (0.02 sec)
複製程式碼

總結:

複製程式碼
#常用字串系列:char與varchar
注:雖然varchar使用起來較為靈活,但是從整個系統的效能角度來說,char資料型別的處理速度更快,有時甚至可以超出varchar處理速度的50%。因此,使用者在設計資料庫時應當綜合考慮各方面的因素,以求達到最佳的平衡

#其他字串系列(效率:char>varchar>text)
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 
BINARY系列 BINARY VARBINARY

text:text資料型別用於儲存變長的大字串,可以組多到65535 (2**16 − 1)個字元。
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
複製程式碼 View Code

 

 

列舉型別和集合型別

欄位的值只能在給定範圍中選擇,如單選框,多選框

enum 單選 只能在給定的範圍內選一個值,如性別 sex 男male/女female

set 多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)

複製程式碼
mysql> create table consumer(
    -> id int,
    -> name varchar(50),
    -> sex enum('male','female','other'),
    -> level enum('vip1','vip2','vip3','vip4'),#在指定範圍內,多選一
    -> fav set('play','music','read','study') #在指定範圍內,多選多
    -> );
Query OK, 0 rows affected (0.03 sec)


mysql> insert into consumer values
    -> (1,'趙雲','male','vip2','read,study'),
    -> (2,'趙雲2','other','vip4','play');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from consumer;
+------+---------+-------+-------+------------+
| id   | name    | sex   | level | fav        |
+------+---------+-------+-------+------------+
|    1 | 趙雲    | male  | vip2  | read,study |
|    2 | 趙雲2   | other | vip4  | play       |
+------+---------+-------+-------+------------+
2 rows in set (0.00 sec)
複製程式碼