目 录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 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区别较小。

,