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字符 極大文本數據

字符集

  字符串分二進制與非二進制類型,二進制用於儲存圖片、聲音等文件,非二進制用於儲存文本數據。

  非二進制文本受字符集和校對規則影響。

  其實字符集說白了就是字符編碼。

 

概念解析

  字符集(Character set)是多個字符的集合,字符集種類較多,每個字符集包含的字符個數不同。常用的字符集有GBKBIG5UTF8

  UTF8字符集包含文字內容更廣,如韓文、日文、德文兼容度更高,也是推薦使用的字符集(UTF8MB4)。

表不設置字符集繼承數據庫,字段不設置字符集繼承表的,所以一般我們在配置文件中為數據庫指定字符集即可

SHOW CHARACTER SET; -- 查看服務器支持的字符集

校對規則

  字符集內用於字符比較和排序的一套規則,以_ci結束的為大小寫不敏感、_bin結束的為不區分大小寫。

  當使用不區分大小寫的校對規則時Aa是相同的,否則則不相同,這會影響到排序與比對。

修改表校對規則,對表的原字段將不影響,只對新增字段影響

SHOW COLLATION; -- 查看服務器支持的校對規則

基本定義

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

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>


免責聲明!

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



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