MySQL
提供了多種關於字符存儲的類型,可是在大多數狀況下咱們只使用char
和varchar
便可。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)是多個字符的集合,字符集種類較多,每一個字符集包含的字符個數不一樣。經常使用的字符集有GBK
、BIG5
、UTF8
。函數
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
結束的爲不區分大小寫。編碼
當使用不區分大小寫的校對規則時A
與a
是相同的,不然則不相同,這會影響到排序與比對。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():查看字符數
建議在同一張數據表中統一使用varchar
或char
類型,這裏更推薦使用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)