MySQL 字符類型

字符類型

   MySQL提供了多種關於字符存儲的類型,但是在大多數情況下我們只使用charvarchar即可

類型 大小 用途
CHAR 0 – 255位元組 定長字符串
VARCHAR 0 – 65535 位元組 變長字符串
TINYBLOB 0 – 255位元組 不超過 255 個字符的二進制字符串
TINYTEXT 0 – 255位元組 短文本字符串
BLOB 0 – 65 535位元組 二進制形式的長文本數據
TEXT 0 – 65 535位元組 長文本數據
MEDIUMBLOB 0 – 16 777 215位元組 二進制形式的中等長度文本數據
MEDIUMTEXT 0 – 16 777 215位元組 中等長度文本數據
LONGBLOB 0 – 4 294 967 295位元組 二進制形式的極大文本數據
LONGTEXT 0 – 4 294 967 295位元組 極大文本數據

基本定義

   對於字符類型而言,其指定寬度均為存入寬度,以字符為單位。

create table temp(
        ch char(5) not null, # 最多5個字符
        vc varcha(5) not null # 最多5個字符
);

定長變長

區別差異

   char是定長字符串,當存入的字符數量不足指定寬度時,將會使用進行填充。

   varchar是變長字符串,當存入的字符數類不足指定寬度時,不會使用任何字符進行填充。

   通常情況下來講char的存取速度要比varchar要高(約50%),但是更加浪費磁盤空間

   在InnoDB存儲引擎中,不存在這種差異。

#官網: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模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)

#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)
    
    檢索:
        尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容

差異詳解

插入值 CHAR(4)存入值 CHAR(4)佔據空間 VARCHAR(4)存入值 VARCHAR(4)佔據空間
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

由於varchar類型是變長存儲,所以需要有一個頭部來標識真實內容佔了多少字符,這個頭部通常佔據1個位元組。

即存入abcd的時候算上頭部實際上是佔用了5個位元組。這也是為什麼說通常情況下varchar比較節省內存,而不是說全部情況。

差異對比

   如果要想進定長與變長的差異對比試驗,需要用到以下兩個函數。

   length():查看位元組數

   char_length():查看字符數

mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';  # 必須修改模式,使其查看定長字符類型時不會將填充空格移除。
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table ch(  # 創建定長字符類型的數據表,最大字符數為5字符
    ->         name char(5) not null
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> create table vc(  # 創建變長字符類型的數據表,最大字符數為5字符
    ->         name varchar(5) not null
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into  ch(name) values("ab");  # 插入2字符的數據
Query OK, 1 row affected (0.01 sec)

mysql> select char_length(name) from ch;  # 可以看到這裡的字符數為5,默認填充了3個空白字符
+-------------------+
| char_length(name) |
+-------------------+
|                 5 |
+-------------------+
1 row in set (0.00 sec)

mysql> insert into  vc(name) values("ab");  # 插入2字符的數據
Query OK, 1 row affected (0.00 sec)

mysql> select char_length(name) from vc;  # 字符數量依舊為2字符
+-------------------+
| char_length(name) |
+-------------------+
|                 2 |
+-------------------+
1 row in set (0.00 sec)

mysql>

   小總結:建議在同一張數據表中統一使用varcharchar類型,這裡更推薦使用char類型。

常用函數

大小寫轉換

   upper()小寫轉大寫,lower()大寫轉小寫

mysql> select upper("mysql"),lower("MYSQL");
+----------------+----------------+
| upper("mysql") | lower("MYSQL") |
+----------------+----------------+
| MYSQL          | mysql          |
+----------------+----------------+
1 row in set (0.00 sec)

mysql>

指定量取

   left()right()函數用於取左或右指定數量的字符

   以下將示例取左邊3個字符。

mysql> select left("一二三四五",3);
+----------------------+
| left("一二三四五",3) |
+----------------------+
| 一二三               |
+----------------------+
1 row in set (0.00 sec)

mysql>

中間字符

   mid()從中間取字符串,參數二為指定起始位置(從1開始),參數三為取的字符數量(可不指定,一直取完)。

   以下將演示從第二個字符開始取兩個。

mysql> select mid("一二三四五",2,2);
+-----------------------+
| mid("一二三四五",2,2) |
+-----------------------+
| 二三                  |
+-----------------------+
1 row in set (0.00 sec)

mysql>

截取子串

   substring()從指定起始位置開始取出向右所有字符串,可指定結束位置。(其實我感覺這個和mid()好像沒啥區別)

mysql> select substring("一二三四五六七八九",1,4);
+-------------------------------------+
| substring("一二三四五六七八九",1,4) |
+-------------------------------------+
| 一二三四                            |
+-------------------------------------+
1 row in set (0.00 sec)

mysql>

字符長度

   char_length()可獲取字符長度,如果要獲取char類型的字符長度且包括填充空白符,需要修改sql模式。

   修改sql模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

mysql> select char_length("一二三四五六七八九");
+-----------------------------------+
| char_length("一二三四五六七八九") |
+-----------------------------------+
|                                 9 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql>

位元組長度

   length()可獲取位元組長度。

mysql> select length("一二三四五六七八九");
+------------------------------+
| length("一二三四五六七八九") |
+------------------------------+
|                           18 |
+------------------------------+
1 row in set (0.00 sec)

mysql>

字符連接

   concat()可將多段字符進行連接。

   以下示例將展示一二三四五---以及12345這三段字符的連接。

mysql> select concat("一二三四五","---","12345");
+------------------------------------+
| concat("一二三四五","---","12345") |
+------------------------------------+
| 一二三四五---12345                 |
+------------------------------------+
1 row in set (0.00 sec)

mysql>
Tags: