字符類型
MySQL
提供了多種關(guān)于字符存儲(chǔ)的類型洒试,但是在大多數(shù)情況下我們只使用char
和varchar
即可势就。
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0 - 255字節(jié) | 定長(zhǎng)字符串 |
VARCHAR | 0 - 65535 字節(jié) | 變長(zhǎng)字符串 |
TINYBLOB | 0 - 255字節(jié) | 不超過(guò) 255 個(gè)字符的二進(jìn)制字符串 |
TINYTEXT | 0 - 255字節(jié) | 短文本字符串 |
BLOB | 0 - 65 535字節(jié) | 二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù) |
TEXT | 0 - 65 535字節(jié) | 長(zhǎng)文本數(shù)據(jù) |
MEDIUMBLOB | 0 - 16 777 215字節(jié) | 二進(jìn)制形式的中等長(zhǎng)度文本數(shù)據(jù) |
MEDIUMTEXT | 0 - 16 777 215字節(jié) | 中等長(zhǎng)度文本數(shù)據(jù) |
LONGBLOB | 0 - 4 294 967 295字節(jié) | 二進(jìn)制形式的極大文本數(shù)據(jù) |
LONGTEXT | 0 - 4 294 967 295字節(jié) | 極大文本數(shù)據(jù) |
字符集
字符串分二進(jìn)制與非二進(jìn)制類型荧关,二進(jìn)制用于儲(chǔ)存圖片、聲音等文件,非二進(jìn)制用于儲(chǔ)存文本數(shù)據(jù)弛针。
非二進(jìn)制文本受字符集和校對(duì)規(guī)則影響轰坊。
其實(shí)字符集說(shuō)白了就是字符編碼铸董。
概念
字符集(Character set)是多個(gè)字符的集合,字符集種類較多肴沫,每個(gè)字符集包含的字符個(gè)數(shù)不同粟害。常用的字符集有GBK
、BIG5
颤芬、UTF8
悲幅。
UTF8
字符集包含文字內(nèi)容更廣,如韓文站蝠、日文汰具、德文兼容度更高,也是推薦使用的字符集(UTF8MB4
)菱魔。
表不設(shè)置字符集繼承數(shù)據(jù)庫(kù)留荔,字段不設(shè)置字符集繼承表的,所以一般我們?cè)谂渲梦募袨閿?shù)據(jù)庫(kù)指定字符集即可澜倦。
mysql> SHOW CHARACTER SET; -- 查看服務(wù)器支持的字符集
+----------+---------------------------------+---------------------+--------+
| 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)
校對(duì)規(guī)則
字符集內(nèi)用于字符比較和排序的一套規(guī)則存谎,以_ci
結(jié)束的為大小寫不敏感拔疚、_bin
結(jié)束的為不區(qū)分大小寫。
當(dāng)使用不區(qū)分大小寫的校對(duì)規(guī)則時(shí)A
與a
是相同的既荚,否則則不相同稚失,這會(huì)影響到排序與比對(duì)。
修改表校對(duì)規(guī)則恰聘,對(duì)表的原字段將不影響句各,只對(duì)新增字段影響。
SHOW COLLATION; -- 查看服務(wù)器支持的校對(duì)規(guī)則
基本定義
對(duì)于字符類型而言晴叨,其指定寬度均為存入寬度凿宾,以字符為單位。
mysql> create table `test` (
-> ch char(5) not null,
-> vc varchar(5) not null
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin兼蕊;
定長(zhǎng)變長(zhǎng)
區(qū)別差異
char
是定長(zhǎng)字符串初厚,當(dāng)存入的字符數(shù)量不足指定寬度時(shí),將會(huì)使用進(jìn)行填充孙技。
varchar
是變長(zhǎng)字符串产禾,當(dāng)存入的字符數(shù)類不足指定寬度時(shí),不會(huì)使用任何字符進(jìn)行填充牵啦。
通常情況下來(lái)講亚情,
char
的存取速度要比varchar
要高(約50%),但是更加浪費(fèi)磁盤空間哈雏。在
InnoDB
存儲(chǔ)引擎中楞件,不存在這種差異。
插入值 | CHAR(4)存入值 | CHAR(4)占據(jù)空間 | VARCHAR(4)存入值 | VARCHAR(4)占據(jù)空間 |
---|---|---|---|---|
'' |
' ' |
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
類型是變長(zhǎng)存儲(chǔ)裳瘪,所以需要有一個(gè)頭部來(lái)標(biāo)識(shí)真實(shí)內(nèi)容占了多少字符土浸,這個(gè)頭部通常占據(jù)1個(gè)字節(jié)。即存入abcd
的時(shí)候算上頭部實(shí)際上是占用了5個(gè)字節(jié)彭羹。這也是為什么說(shuō)通常情況下varchar
比較節(jié)省內(nèi)存黄伊,而不是說(shuō)全部情況。
差異對(duì)比
如果要想進(jìn)定長(zhǎng)與變長(zhǎng)的差異對(duì)比試驗(yàn)皆怕,需要用到以下兩個(gè)函數(shù)毅舆。
length():查看字節(jié)數(shù)
char_length():查看字符數(shù)
建議在同一張數(shù)據(jù)表中統(tǒng)一使用varchar
或char
類型西篓,這里更推薦使用char
類型愈腾。
常用函數(shù)
大小寫轉(zhuǎn)換
upper()
小寫轉(zhuǎn)大寫,lower()
大寫轉(zhuǎn)小寫岂津。
以下將演示大小寫轉(zhuǎn)換虱黄。
mysql> select upper("justthesame"),lower("JUSTTHESAME");
+----------------------+----------------------+
| upper("justthesame") | lower("JUSTTHESAME") |
+----------------------+----------------------+
| JUSTTHESAME | justthesame |
+----------------------+----------------------+
1 row in set (0.00 sec)
指定量取
left()
與right()
函數(shù)用于取左或右指定數(shù)量的字符。
以下將演示取左邊3個(gè)字符吮成。
mysql> select left("qwert",3);
+-----------------+
| left("qwert",3) |
+-----------------+
| qwe |
+-----------------+
1 row in set (0.00 sec)
中間字符
mid()
從中間取字符串橱乱,參數(shù)二為指定起始位置(從1開(kāi)始)辜梳,參數(shù)三為取的字符數(shù)量(可不指定,一直取完)泳叠。
以下將演示從第二個(gè)字符開(kāi)始取兩個(gè)作瞄。
mysql> select mid("qwert",2,2);
+------------------+
| mid("qwert",2,2) |
+------------------+
| we |
+------------------+
1 row in set (0.00 sec)
截取字符
substring()
從指定起始位置開(kāi)始取出向右所有字符串,可指定結(jié)束位置危纫。(其實(shí)我感覺(jué)這個(gè)和mid()
好像沒(méi)啥區(qū)別)宗挥。
以下將演示截取第一個(gè)字符到第四個(gè)字符。
mysql> select substring("qwertyui",1,4);
+---------------------------+
| substring("qwertyui",1,4) |
+---------------------------+
| qwer |
+---------------------------+
1 row in set (0.00 sec)
字符長(zhǎng)度
char_length()
可獲取字符長(zhǎng)度种蝶,如果要獲取char
類型的字符長(zhǎng)度且包括填充空白符契耿,需要修改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)
字節(jié)長(zhǎng)度
length()
可獲取字節(jié)長(zhǎng)度螃征。
mysql> select length("qwertyu");
+-------------------+
| length("qwertyu") |
+-------------------+
| 7 |
+-------------------+
1 row in set (0.00 sec)
字符連接
concat()
可將多段字符進(jìn)行連接搪桂。
mysql> select concat("123","abc","456","def");
+---------------------------------+
| concat("123","abc","456","def") |
+---------------------------------+
| 123abc456def |
+---------------------------------+
1 row in set (0.00 sec)