程序员的知识教程库

网站首页 > 教程分享 正文

mysql之数据类型char、varchar(mysql数据类型decimal)

henian88 2024-10-24 10:24:37 教程分享 41 ℃ 0 评论

目 录

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表