网站首页 > 教程分享 正文
目 录
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区别较小。
猜你喜欢
- 2024-10-24 《MySQL 入门教程》第 17 篇 MySQL 变量
- 2024-10-24 MySQL面试题-数据类型(mysql数据库面经)
- 2024-10-24 MySql学习笔记21——数据类型(小数)
- 2024-10-24 MySQL字段类型最全解析(mysql的字段名指的是什么)
- 2024-10-24 Mysql的数据类型和JPA的实体类(mysql jpa)
- 2024-10-24 一文搞懂MySQL的三大Log(mysql 3)
- 2024-10-24 MySQL有哪些数据库类型?不要错过喽
- 2024-10-24 MySQL分区表简介(mysql 分区语句)
- 2024-10-24 MySQL 数据类型的艺术-爱可生(mysql数据类型包括哪些)
- 2024-10-24 MySQL进阶实战1,数据类型与三范式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)