mysql 字符串类型 char varchar
?
?
?字符類型用在存儲名字、郵箱地址、家庭住址等描述性數(shù)據(jù)
?
char指的是定長字符,varchar指的是變長字符
#官網(wǎng):https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括號內(nèi)的參數(shù)指的都是字符的長度#char類型:定長,簡單粗暴,浪費空間,存取速度快字符長度范圍:0-255(一個中文是一個字符,是utf8編碼的3個字節(jié))存儲:存儲char類型的值時,會往右填充空格來滿足長度例如:指定長度為10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲檢索:在檢索或者說查詢時,查出的結(jié)果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)#varchar類型:變長,精準(zhǔn),節(jié)省空間,存取速度慢字符長度范圍:0-65535(如果大于21845會提示用其他類型 。mysql行最大限制為65535字節(jié),字符編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)存儲:varchar類型存儲數(shù)據(jù)的真實內(nèi)容,不會用空格填充,如果'ab ',尾部的空格也會被存起來強(qiáng)調(diào):varchar類型會在真實數(shù)據(jù)前加1-2Bytes的前綴,該前綴用來表示真實數(shù)據(jù)的bytes字節(jié)數(shù)(1-2Bytes最大表示65535個數(shù)字,正好符合mysql對row的最大字節(jié)限制,即已經(jīng)足夠使用)如果真實的數(shù)據(jù)<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數(shù)字為255)如果真實的數(shù)據(jù)>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數(shù)字為65535)檢索:尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內(nèi)的內(nèi)容
?
?
?
?
創(chuàng)建兩張表
只有整型類型的寬度是顯示寬度,其他類型的寬度都是存儲寬度
?寬度指的是字符的個數(shù)
mysql> create table t13(name char(5)); Query OK, 0 rows affected (0.02 sec)mysql> create table t14(name varchar(5)); Query OK, 0 rows affected (0.01 sec)?
char就是定長,不夠5個字符,會補(bǔ)全到5個字符,補(bǔ)全相應(yīng)的空格,由空格作為占位符,湊夠5個空格。
varchar就是變長,傳幾個字符,就存幾個。
插入數(shù)據(jù)
mysql> insert into t13 values('李剛 '); #'李剛 ' Query OK, 1 row affected (0.00 sec)mysql> insert into t14 values('李剛 '); #'李剛 ' Query OK, 1 row affected (0.00 sec)?
查詢表,看不到效果
mysql> select name from t13; # +--------+ | name | +--------+ | 李剛 | +--------+ 1 row in set (0.00 sec)mysql> select name from t14; # +---------+ | name | +---------+ | 李剛 | +---------+ 1 row in set (0.00 sec?
?mysql函數(shù)
length:查看字節(jié)數(shù) char_length:查看字符數(shù)?
?
char類型 存的是5個 查的是2個
mysql 在存char類型時候 ,會自動補(bǔ)全空格存進(jìn)來, 取的時候把默認(rèn)的空格去掉
mysql> select char_length(name) from t13; # +-------------------+ | char_length(name) | +-------------------+ | 2 | +-------------------+ 1 row in set (0.00 sec)?
?
varchar 存的是5個 查的是3個
mysql> select char_length(name) from t14; # +-------------------+ | char_length(name) | +-------------------+ | 3 | +-------------------+ 1 row in set (0.00 sec)?
char填充空格來滿足固定長度,但是在查詢時卻會很不要臉地刪除尾部的空格(裝作自己好像沒有浪費過空間一樣),然后修改sql_mode讓其現(xiàn)出原形
?
#略施小計,讓char現(xiàn)出原形,設(shè)置sql模式,mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
?
出現(xiàn)原形
mysql> select char_length(name) from t13; +-------------------+ | char_length(name) | +-------------------+ | 5 | +-------------------+ 1 row in set (0.00 sec)?
對于char 和varchar來說 不管怎么存 取得時候mysql只會對值進(jìn)行比較 不會管末尾的空格,末尾空格沒有意義只是末尾空格
驗證 mysql> select name from t13 where name='李剛 '; +-----------+ | name | +-----------+ | 李剛 | +-----------+ 1 row in set (0.00 sec)mysql> select name from t13 where name='李剛'; +-----------+ | name | +-----------+ | 李剛 | +-----------+
?
開頭 、中間有空格 都查詢不到 mysql> select name from t13 where name=' 李剛'; Empty set (0.00 sec)mysql> select name from t13 where name='李 剛'; Empty set (0.00 sec)?
用模糊查詢?like,用like mysql就不會把末尾空格去掉。
精確的輸入?
mysql> select name from t13 where name like '李剛 '; Empty set (0.00 sec) mysql> select name from t13 where name like '李剛 '; Empty set (0.00 sec) # 后面補(bǔ)全三個空格可以查詢出來 mysql> select name from t13 where name like '李剛 '; +-----------+ | name | +-----------+ | 李杰 | +-----------+ 1 row in set (0.00 sec)?
#常用字符串系列:char與varchar
注:雖然varchar使用起來較為靈活,但是從整個系統(tǒng)的性能角度來說,char數(shù)據(jù)類型的處理速度更快,有時甚至可以超出varchar處理速度的50%。
因此,用戶在設(shè)計數(shù)據(jù)庫時應(yīng)當(dāng)綜合考慮各方面的因素,以求達(dá)到最佳的平衡
大部分場景用char類型
建議
一張表里 不要char varchar混著用 ,要么全用char類型,要么全用varchar類型
?
轉(zhuǎn)載于:https://www.cnblogs.com/mingerlcm/p/9799813.html
總結(jié)
以上是生活随笔為你收集整理的mysql 字符串类型 char varchar的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【汇总目录】C#
- 下一篇: [POJ1463] Strategic