MySQL中CHAR和VARCHAR區別
以下都是基於mysql5.0以上版本而言,也就是char和varchar括號內指定的都是最大字元數,話不多說先上結論:
行為 | char 欄位 | varchar 欄位 |
---|---|---|
最大長度 | 255字元 | 括號中最大的字元數通過編碼來算,不超過行65535個位元組 |
是否定長 | 定長,不足的部分用隱藏空格填充 | 不定長,保留實際字元 |
空間使用 | 可能浪費 | 更加節省 |
查詢效率 | 高 | 低 |
尾部空格 | 插入時省略 | 插入時不會省略,查詢時可省略 |
like查詢 | 語句中like後的’ '不會省 | 語句中like後的’ '不會省,欄位結尾的空格也不會省 |
以上都是指嚴格模式下的情況,如果修改為寬鬆模式,插入時超過指定最大字元數會擷取然後插入。具體改變寬鬆模式看:mysql修改sql_mode為寬鬆模式https://www.cnblogs.com/ningjiabing/p/12795338.html
測試
測試一下是不是如結論,所說尾部空格,包括:長度檢視、尾部空格、查詢的測試
建立表tset_char_varchar
-----------建表------------
CREATE TABLE tset_char_varchar
(
id int PRIMARY KEY,
_char CHAR(10) DEFAULT NULL,
_varchar varchar(10) DEFAULT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='測試char和varchar區別表';
TRUNCATE tset_char_varchar;
-----------插入-------------
INSERT INTO
tset_char_varchar VALUE
(1, '123456', '123456'),
(2, '0123456789', '0123456789'),
(3, '一二三四五六七八九十', '一二三四五六七八九十');
-----------查詢-------------
SELECT
_char,
CHAR_LENGTH(_char) char字元數,
LENGTH(_char) char位元組數,
_varchar,
CHAR_LENGTH(_varchar) varchar字元數,
LENGTH(_varchar) varchar位元組數
FROM
tset_char_varchar;
從上圖可以看到插入不足10個字元、10個數字、十個漢字所對應的字元數和子節數,在這裡還沒看出差別。(當然如果插入的字元數>10會報錯)
接下來測試一下帶空格的資料
---為了檢視方便把以上資料刪除--
TRUNCATE tset_char_varchar;
-------插入資料------
INSERT INTO
tset_char_varchar
VALUES
(1, 'a', 'a'),
(2,' a',' a'),
(3,'a ','a '),
(4,' a ',' a ');
1為不帶空格,2為左邊帶空格,3為右邊帶空格,4為兩邊都帶空格
插入之後檢視查詢結果:
SELECT
_char,
CHAR_LENGTH(_char) char字元數,
LENGTH(_char) char位元組數,
_varchar,
CHAR_LENGTH(_varchar) varchar字元數,
LENGTH(_varchar) varchar位元組數
FROM
tset_char_varchar;
看第3、4條資料的字元數和位元組數出現了不一致。
id=3儲存的是隻有右邊有空格,那麼varchar
把空格保留下來了,可以推斷出id=4這條資料char
中缺失的就是右邊空格所佔的位元組,如果不信的話,下面進行驗證。
測試查詢帶空格的資料
- 查詢
_char
不帶空格的結果:
SELECT * FROM tset_char_varchar WHERE _char = 'a';
- 查詢
_char
左側空格的結果:
SELECT * FROM tset_char_varchar WHERE _char = ' a';
- 查詢
_char
右側空格的結果:
SELECT * FROM tset_char_varchar WHERE _char = 'a ';
結果什麼都沒有!
- 查詢查詢
_char
兩側空格的結果:
SELECT * FROM tset_char_varchar WHERE _char = ' a ';
結果什麼都沒有!
- 查詢查詢
_varchar
結果:
SELECT * FROM tset_char_varchar WHERE _varchar = 'a ';
SELECT * FROM tset_char_varchar WHERE _varchar = ' a';
SELECT * FROM tset_char_varchar WHERE _varchar = 'a ';
SELECT * FROM tset_char_varchar WHERE _varchar = ' a ';
具體圖片不做贅述,這裡每一條都只能查到唯一一條資料。
【結論】:char方式插入,右邊有空格會自動過濾掉!!
另附常用字符集
以一個字元為例:
字元編碼 | 英文字母(單位:byte) | 中文漢字(單位:byte) |
---|---|---|
ISO-8859-1 | 1 | 1 |
GB2312 | 1 | 2 |
GBK | 1 | 2 |
UTF-8 | 1 | 3 |
UTF-16 | 4 | 4 |
UTF-8字元編碼的優勢非常明顯, 英文和數字(也就是ASCII字符集)只用一個byte, 而歐洲語言比如希臘語的字元佔用2個byte,中文佔用3個byte(超大字符集漢字佔4個byte)。為了世界通用,所以後來像tomcat 8.x IDE等該用utf-8作為預設編碼,也可以顯示中文字元。
參考
Mysql中char和varchar的區別:https://blog.csdn.net/albertsh/article/details/97501893
MySQL中varchar和char區別(轉):https://www.cnblogs.com/webph/p/6679815.html
MySQL的char和varchar針對空格的處理:https://www.cnblogs.com/dsitn/p/7346761.html
相關文章
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- varchar和char的區別
- NTMySQL中varchar和char型別的區別heeMySql型別
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- MySQL中int、char、varchar的效能淺談MySql
- 深入char、varchar、text
- Oracle 中varchar2 和nvarchar2區別Oracle
- 高效能MySQL第四章 Schema與資料型別優化 VARCHAR和CHARMySql資料型別優化
- 自導自演的面試現場:說說char 和 varchar的區別你瞭解多少?面試
- const char*, char const*, char*const 有何區別?
- mysql中!=和is not的區別MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- mysql中varchar型別最大長度測試MySql型別
- Rust中 String、str、&str、char 的區別Rust
- 面試官瘋狂問我:char和varchar的區別 怎麼辦?愣著幹嘛?進來白嫖啊!面試
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- MySQL中datetime和timestamp的區別MySql
- 例項操作mysql varchar型別求和MySql型別
- mysql char_length和lengthMySql
- MySQL中REPLACE INTO和INSERT INTO的區別分析MySql
- Mysql BLOB、BLOB與TEXT區別及效能影響、將BLOB型別轉換成VARCHAR型別MySql型別
- Mysql中S 鎖和 X 鎖的區別MySql
- 【Mysql】MySQL中interactive_timeout和wait_timeout的區別MySqlAI
- MySQL和Oracle的區別MySqlOracle
- Oracle和MySQL的區別OracleMySql
- MYSQL和SQL的區別MySql
- MySQL varchar詳解MySql
- MySQL VARCHAR型別欄位到底可以定義多長MySql型別
- Mysql中tinyint(1)和tinyint(4)的區別詳析WIFRMySql
- 談談mysql和redis的區別MySqlRedis
- SQLserver-MySQL的區別和用法ServerMySql
- mysql alter modify 和 change的區別MySql
- MySQL之Where和Having的區別MySql
- Oracle 和 mysql的9點區別OracleMySql
- mongodb和mysql有什麼區別MongoDBMySql
- 面試官:MySQL 中 varchar(n) 中 n 最大取值為多少?面試MySql