目 录1 CHAR与VARCHAR,现在小编就来说说关于mysql 有varchar2吗?下面内容希望能帮助到你,我们来一起看看吧!
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区别较小。
,