mysql char和varchar_MySQL char与varchar的差异
字符與字節(jié)的區(qū)別
一個字符由于所使用的字符集的不同,會并存儲在一個或多個字節(jié)中,所以一個字符占用多少個字節(jié)取決于所使用的字符集
注意:char與varchar后面接的數(shù)據(jù)大小為存儲的字符數(shù),而不是字節(jié)數(shù)
char與varchar的差異
為方便說明,我們下面定義一個表:
CREATE TABLE `t_users` (
`name` CHAR(10) NOT NULL,
`subject` VARCHAR(10) NOT NULL,
`description` CHAR(10) NOT NULL
)
INSERT INTO `t_users` (`name`, `subject`, `description`) VALUES ('zejin', 'zejin ', 'zejin ');
存數(shù)據(jù)時的區(qū)別
char定義的是固定長度,長度范圍為0-255,存儲時,如果字符數(shù)沒有達到定義的位數(shù),會在后面用空格補全存入數(shù)據(jù)庫中,在上例中,name實際存儲在數(shù)據(jù)中的數(shù)據(jù)為'zejin '
varchar是變長長度,長度范圍為0-65535,存儲時,如果字符沒有達到定義的位數(shù),也不會在后面補空格,在上例subject字段中,實際存儲在數(shù)據(jù)中的數(shù)據(jù)為'zejin ',當然還有一或兩個字節(jié)來描述該字節(jié)長度
取數(shù)據(jù)時的區(qū)別
數(shù)據(jù)庫取char的數(shù)據(jù)時,會把后面的空格全部丟棄掉,譬如上例中的description字段取出來時只剩zejin
mysql> select concat('(',name,')'),concat('(',description,')') from t_users;
+----------------------+-----------------------------+
| concat('(',name,')') | concat('(',description,')') |
+----------------------+-----------------------------+
| (zejin) | (zejin) |
+----------------------+-----------------------------+
1 row in set (0.00 sec)
也就是說,在char中的尾部存入空格時,最后取出來都會被丟棄
而數(shù)據(jù)庫在取varchar數(shù)據(jù)時,尾部空格會保留,譬如subject字段:
mysql> select concat('(',subject,')'),concat('(',description,')') from t_users;
+-------------------------+-----------------------------+
| concat('(',subject,')') | concat('(',description,')') |
+-------------------------+-----------------------------+
| (zejin ) | (zejin) |
+-------------------------+-----------------------------+
1 row in set (0.00 sec)
占用字節(jié)差別
以latin編碼為便,一個字符占用一個字節(jié)。
Value
CHAR(4)
Storage Required
VARCHAR(4)
Storage Required
''
' '
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
可以用上表來表示,當定義char時,不管你存入多少字符,都會占用到你定義的字符數(shù),而用varchar時,則和你輸入的字符數(shù)有關,會多一到兩個字節(jié)來記錄字節(jié)長度,當數(shù)據(jù)位占用的字節(jié)數(shù)小于255時,用1個字節(jié)來記錄長度,數(shù)據(jù)位占用字節(jié)數(shù)大于255時,用2個字節(jié)來記錄長度,還有一位來記錄是否為nul值
注意
mysql每一行的最大字節(jié)數(shù)為65535,當你使用utf8,一個字符有可能占用三個字節(jié)的時候,varchar如果定義允許空的話能定義的最大長度為(65535-1-2)/3=21844.
Mysql在對比char,varchar,text類型的數(shù)據(jù)時,是不會把尾部的空格考慮在內(nèi)的,這對所有字符集都適用,但在這里是除了like比較符的,譬如:
mysql> select name='zejin',name='zejin ' from t_users;
+--------------+----------------+
| name='zejin' | name='zejin ' |
+--------------+----------------+
| 1 | 1 |
+--------------+----------------+
1 row in set (0.00 sec)
mysql> select name like 'zejin',name like 'zejin ' from t_users;
+-------------------+---------------------+
| name like 'zejin' | name like 'zejin ' |
+-------------------+---------------------+
| 1 | 0 |
+-------------------+---------------------+
1 row in set (0.00 sec)
總結
以上是生活随笔為你收集整理的mysql char和varchar_MySQL char与varchar的差异的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: adroid 如何测试端口号_多进程启动
- 下一篇: linux cmake编译源码,linu