MySQL的字符類型

字符類型

MySQL提供了多種關(guān)于字符存儲(chǔ)的類型洒试,但是在大多數(shù)情況下我們只使用charvarchar即可势就。

類型 大小 用途
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ù)不同粟害。常用的字符集有GBKBIG5颤芬、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í)Aa是相同的既荚,否則則不相同稚失,這會(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)一使用varcharchar類型西篓,這里更推薦使用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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盯滚,隨后出現(xiàn)的幾起案子踢械,更是在濱河造成了極大的恐慌,老刑警劉巖淌山,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裸燎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泼疑,警方通過(guò)查閱死者的電腦和手機(jī)德绿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)退渗,“玉大人移稳,你說(shuō)我怎么就攤上這事』嵊停” “怎么了个粱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翻翩。 經(jīng)常有香客問(wèn)我都许,道長(zhǎng),這世上最難降的妖魔是什么嫂冻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任胶征,我火速辦了婚禮,結(jié)果婚禮上桨仿,老公的妹妹穿的比我還像新娘睛低。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钱雷。 她就那樣靜靜地躺著骂铁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罩抗。 梳的紋絲不亂的頭發(fā)上拉庵,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音套蒂,去河邊找鬼名段。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泣懊,可吹牛的內(nèi)容都是我干的伸辟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼馍刮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼信夫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卡啰,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤静稻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后匈辱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體振湾,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年亡脸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了押搪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浅碾,死狀恐怖大州,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垂谢,我是刑警寧澤厦画,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滥朱,受9級(jí)特大地震影響根暑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜徙邻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一排嫌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹃栽,春花似錦躏率、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至丰嘉,卻和暖如春夯到,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饮亏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工耍贾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人路幸。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓荐开,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親简肴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晃听,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355