日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql char和varchar_MySQL char与varchar的差异

發(fā)布時間:2024/4/19 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql char和varchar_MySQL char与varchar的差异 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

字符與字節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。