tft每日頭條

 > 科技

 > mysql 有varchar2嗎

mysql 有varchar2嗎

科技 更新时间:2025-01-25 10:47:22

mysql 有varchar2嗎?目 錄1 CHAR與VARCHAR,現在小編就來說說關于mysql 有varchar2嗎?下面内容希望能幫助到你,我們來一起看看吧!

mysql 有varchar2嗎(mysql之數據類型charvarchar)1

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved