mysql 有varchar2嗎?目 錄1 CHAR與VARCHAR,現在小編就來說說關于mysql 有varchar2嗎?下面内容希望能幫助到你,我們來一起看看吧!
目 錄
1 CHAR與VARCHAR
1.1 CHAR
1.2 VARCHAR
1.3 舉例
1.4 NO PAD和PAD SPACE
2 BINARY與VARBINARY
2.1 binary
2.1.1 參數意義不同
2.1.2 填充
2.2 varbinary
2.3 總結
1CHAR與VARCHAR
1.1 CHAR
0~255之間的固定長度,當存儲一個char值時,右面填充"空格";當提取時,後面的"空格"将被移除.
若sql_mode含有PAD_CHAR_TO_FULL_LENGTH,則提取時後面的"空格"不會移除,mysql不推薦PAD_CHAR_TO_FULL_LENGTH,未來會将其删除。
1.2VARCHAR
0~65535之間的變長,與标準sql一樣,沒有填充,字符串中若有"空格",無論是存儲還是提取,空格都不會被删除。
1.3舉例
char是固定長度,以"空格"填充,所以當存入的字符串後面有沒有"空格"對存儲引擎來說都一樣。當從列中提取時,mysql分不清字符串後面的"空格"是傳入的還是自動填充的,所以幹脆都全部舍棄。
varchar是變長的,不會填充,所以前端傳入什麼,提取出來就是什麼。
例如"ab"與"ab "在char列是一樣的,在varchar列是不一樣的。
mysql> create table ch(val char(4) PRIMARY key);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into ch select 'ab';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into ch select 'ab ';
ERROR 1062 (23000): Duplicate entry 'ab' for key 'PRIMARY'
表ch字段val char(4)是主鍵,已經插入了”ab”,再插入”ab ”,報主鍵沖突。
mysql> create table vc(val varchar(4) COLLATE utf8mb4_0900_bin primary key);
Query OK, 0 rows affected (0.30 sec)
mysql> insert into vc select 'ab';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into vc select 'ab ';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
表vc字段val varchar(4)是主鍵,插入”ab”後,再插入”ab ”也是成功的。
下圖是不同的值在char(4)和varchar(4)字段中存儲的情況。
Value CHAR(4) Storage Required VARCHAR(4) Storage Required
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'ab ' 'ab ' 4 bytes 'ab ' 5 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes
1.4NO PAD和PAD SPACE
上面varchar的例子中特意指定了字符集校驗規則為utf8mb4_0900_bin,這是因為其Pad_attribute為NO PAD,如果使用了PAD SPACE對應的校驗規則,那在插入之前在hash中搜索時會忽略字符串後面的空格,'ab'與'ab '是一樣的,這就會報主鍵沖突,插入失敗。
校驗規則如下:
mysql> show collation where charset='utf8mb4';
---------------------------- --------- ----- --------- ---------- --------- ---------------
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
---------------------------- --------- ----- --------- ---------- --------- ---------------
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | Yes | Yes | 0 | NO PAD |
| utf8mb4_0900_as_ci | utf8mb4 | 305 | | Yes | 0 | NO PAD |
| utf8mb4_0900_as_cs | utf8mb4 | 278 | | Yes | 0 | NO PAD |
| utf8mb4_0900_bin | utf8mb4 | 309 | | Yes | 1 | NO PAD |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | PAD SPACE |
| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 | PAD SPACE |
| utf8mb4_cs_0900_ai_ci | utf8mb4 | 266 | | Yes | 0 | NO PAD |
| utf8mb4_cs_0900_as_cs | utf8mb4 | 289 | | Yes | 0 | NO PAD |
| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 | PAD SPACE |
| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 | PAD SPACE |
對應的代碼如下,在innobase_mysql_cmp函數中:
innobase/rem/rem0cmp.cc:innobase_mysql_cmp
2BINARY與VARBINARY
2.1binary
類似char,也是固定長度,但有以下不同:
2.1.1參數意義不同
binary(4)表示隻能存儲4個字節,char(4)表示能夠存儲4個字符。
2.1.2填充
binary以0x00填充,char以0x20。查詢時binary會将所有的0x00提取出來,但char默認不會取出填充物。
create table bin(val binary(4));
insert into bin value ('a'), ('a '), ('a\0');
mysql> select hex(val) from bin;
----------
| hex(val) |
----------
| 61000000 |
| 61200000 |
| 61000000 |
----------
2.2varbinary
類似varchar,也是固定長度,但存儲的是字節,不是字符。
2.3總結
binary和char區别比較大,查詢binary字段時會提取整個字段的長度。
varbinary與varchar區别較小。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!