MySQL的字符類型

MySQL的字符類型

字符類型

MySQL提供了多種關於字符存儲的類型,可是在大多數狀況下咱們只使用charvarchar便可。mysql

類型 大小 用途
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字節 極大文本數據

字符集

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

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

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

概念

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

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

表不設置字符集繼承數據庫,字段不設置字符集繼承表的,因此通常咱們在配置文件中爲數據庫指定字符集便可。
mysql> SHOW CHARACTER SET; -- 查看服務器支持的字符集
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| binary   | Binary pseudo charset           | binary              |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.04 sec)

校對規則

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

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

修改表校對規則,對錶的原字段將不影響,只對新增字段影響。
SHOW COLLATION; -- 查看服務器支持的校對規則

基本定義

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

mysql> create table `test` (
    -> ch char(5) not null,
    -> vc varchar(5) not null
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

定長變長

區別差別

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

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

一般狀況下來說char的存取速度要比 varchar要高(約50%),可是 更加浪費磁盤空間

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

插入值 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():查看字符數

建議在同一張數據表中統一使用varcharchar類型,這裏更推薦使用char類型。

經常使用函數

大小寫轉換

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

如下將演示大小寫轉換。

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

指定量取

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

如下將演示取左邊3個字符。

mysql> select left("qwert",3);
+-----------------+
| left("qwert",3) |
+-----------------+
| qwe             |
+-----------------+
1 row in set (0.00 sec)

中間字符

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

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

mysql> select mid("qwert",2,2);
+------------------+
| mid("qwert",2,2) |
+------------------+
| we               |
+------------------+
1 row in set (0.00 sec)

截取字符

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

如下將演示截取第一個字符到第四個字符。

mysql> select substring("qwertyui",1,4);
+---------------------------+
| substring("qwertyui",1,4) |
+---------------------------+
| qwer                      |
+---------------------------+
1 row in set (0.00 sec)

字符長度

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

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

mysql> select char_length("qwertyu");
+------------------------+
| char_length("qwertyu") |
+------------------------+
|                      7 |
+------------------------+
1 row in set (0.00 sec)

字節長度

length()可獲取字節長度。

mysql> select length("qwertyu");
+-------------------+
| length("qwertyu") |
+-------------------+
|                 7 |
+-------------------+
1 row in set (0.00 sec)

字符鏈接

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

mysql> select concat("123","abc","456","def");
+---------------------------------+
| concat("123","abc","456","def") |
+---------------------------------+
| 123abc456def                    |
+---------------------------------+
1 row in set (0.00 sec)
相關文章
相關標籤/搜索