有趣生活

当前位置:首页>科技>mysql 有varchar2吗mysql之数据类型charvarchar

mysql 有varchar2吗mysql之数据类型charvarchar

发布时间:2026-07-21阅读(1)

导读目录1CHAR与VARCHAR,现在小编就来说说关于mysql有varchar2吗?下面内容希望能帮助到你,我们来一起看看吧!mysql有varchar2吗....

目 录1 CHAR与VARCHAR,现在小编就来说说关于mysql 有varchar2吗?下面内容希望能帮助到你,我们来一起看看吧!

mysql 有varchar2吗(mysql之数据类型charvarchar)

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 RequiredVARCHAR(4)Storage Required

4 bytes1 byte

abab 4 bytesab3 bytes

ab ab 4 bytesab 5 bytes

abcdabcd4 bytesabcd5 bytes

abcdefghabcd4 bytesabcd5 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区别较小。

TAGS标签:  mysql  varchar2  数据  类型  mysql 有var  char2吗mysq

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图