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中char varchar區別MySql
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- varchar和char的區別
- char ,varchar2和varchar的區別
- NTMySQL中varchar和char型別的區別heeMySql型別
- char和varchar2的區別
- Mysql中varchar與char的區別以及varchar(30)中的30代表的涵義MySql
- char(n)和varchar2(n)區別
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- oracle中char與varchar2的區別Oracle
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- char,nchar,varchar,nvarchar的區別和特點
- MySQL CHAR和VARCHAR資料型別介紹MySql資料型別
- mysql的varchar(N)和int(N)的含義及其與char區別MySql
- Oracle CHAR,VARCHAR,VARCHAR2,nvarchar型別的區別與使用Oracle型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- 【基礎】Oracle CHAR,VARCHAR,VARCHAR2,nvarchar型別的區別與使用Oracle型別
- Sql server char,nchar,varchar與Nvarchar的區別SQLServer
- MySQL中int、char、varchar的效能淺談MySql
- VARCHAR2(N CHAR)與VARCHAR2(N)的區別[Oracle基礎]Oracle
- char str[]和char *str的區別
- MYSQL INNODB主鍵使用varchar和int的區別MySql
- Oracle 中varchar2 和nvarchar2區別Oracle
- 自導自演的面試現場:說說char 和 varchar的區別你瞭解多少?面試
- MySQL中varchar和char定義長度是字元,與Oracle nvarchar2類似MySql字元Oracle
- 資料庫中varchar和Nvarchar區別與聯絡資料庫
- Oracle的資料型別:char/varchar2Oracle資料型別
- Proc中使用char陣列、VARCHAR陣列和char變數進行DELETE操作具體行數的細微區別陣列變數delete
- 高效能MySQL第四章 Schema與資料型別優化 VARCHAR和CHARMySql資料型別優化
- mysql中!=和is not的區別MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- MYSQL的CHAR和VARCHAR注意事項 以及binary和varbinary儲存方式MySql
- char nchar varchar2 nvarchar2 區別-Oracle (varchar2 max 4K, 2K漢字)Oracle
- SQL插入語句中有單引號 && SQL中char nchar varchar nvarchar的區別 && Java中字元(串)和數值型別的轉換SQLJava字元型別
- 【基礎】ORACLE CHAR 與 VARCHAROracle
- mysql中varchar型別最大長度測試MySql型別
- const char*, char const*, char*const的區別