MySQL数据类型之字符串(string)
字符类型(CHAR Types)
CREATE TABLE t1 (c1 CHAR(10));
该语句创建了⼀张t1表,表中只有⼀个字段c1,类型为char,char(10)括号中的10表⽰字段c1最多能够存储10个字符。char最多可以存储255个字符,最⼩可以存储0个字符。可以如下向表中插⼊数据:
INSERT INTO t1 (c1) VALUES('');
INSERT INTO t1 (c1) VALUES('xy');
INSERT INTO t1 (c1) VALUES('0123456789');
该语句向c1字符中分别插⼊了长度为0,2和10的三个字符,可以如下查询数据:
select * from t1
结果如图:
虽然插⼊了两条不⾜10个字符的数据,但是MySQL在存储char类型数据时,仍然占⽤10个字符个空间,它在不⾜10个字符的右边添加空⽩字符补⾜10个字符长度,所以char类型存储时的长度是固定的。可以如下查询字符长度:
SELECT c1, CHAR_LENGTH(c1) FROM t1;
结果如图:
欧洲杯日本有⼈肯定要问,刚刚不是说每个值都应该是10个字符长度吗?没错。但是MySQL在查询char类型数据时,默认做了⼀个处理,它将值后⾯的所有空格全部移除,然后再将结果返回给我们。也就是上⾯的这个结果。可以如下来取消这个处理
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
再次执⾏上⾯的这个查询,结果是:
图中竖线是⿏标光标位置,光标前⾯就是10个空⽩字符。
可变字符类型(Varchar Types)
varchar类型和char类型⾮常相似。如下创建⼀张表t2
CREATE TABLE t2 (c1 VARCHAR(10));
该表c1字段是varchar类型,10也是表⽰c1字符能够存储的最⼤字符长度。如下向表中插⼊三条数据
INSERT INTO t2 (c1) VALUES('');
INSERT INTO t2 (c1) VALUES('xy');
INSERT INTO t2 (c1) VALUES('0123456789');
不同的是MySQL在存储VARCHAR类型时,存储实际长度,也就是说存储c1字段的值时分别占⽤0、2和10个字符空间(实际要⼤1-2个字节⽤于存储字符长度),这点和char类型是不同的。可以执⾏如下语句来验证
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
SELECT c1, CHAR_LENGTH(c1) FROM t2;
reshot设置sql_mode之前和之后,c1的长度不变,如图:
varchar类型能够存储最多65535个字符,但是需要注意,不是每个表的字段都能申请到这个长度,因为MySQL对单⾏的⼤⼩限制为65535个字节,也就是表的⼀⾏的所有字段⼤⼩的和不能超过65535个字节。如果其他字段已经申请了⽐较⼤的空间,那么c1字段可能就不能申请65535个字符空间了。
(1)存储超过定义时指定长度的字符
这个由sql_mode决定,在strict mode下,插⼊失败并报错,在⾮strict mode会插⼊成功,超过部分会被截取掉,如图:
integrate是什么意思strict mode:
重新设置sql_mode变量,再插⼊:
⼆进制类型(BINARY Types)
binary类型和char类型很相似,binary类型存储的是字节串⽽不是字符串,存储的最⼤字节串长度也是255,binary类型存储不⾜长度的值时也是在值的右边进⾏补全,不过⽤于补全的值是0x00(字符表⽰为'\0'),但查询时会保留尾部补全的值。例如对于BINARY(3),插⼊'a '时,存储的是'a \0',插⼊'a\0'时,存储的是'a\0\0',查询时分别是'a \0'和'a\0\0'。可以如下验证
CREATE TABLE t3 (c BINARY(3));
INSERT INTO t3 VALUES('a');
SELECT c,CHAR_LENGTH(c),HEX(c),c = 'a', c = 'a\0\0' from t3;
结果如图:
说明查询到的是'a\0\0',不过显⽰的是a。
可变⼆进制类型(VARBINARY Types)transparent中文翻译
varbinary和varchar类似,存储的是字节串,存储的最⼤字节长度为65535,存储实际定义的字节长度,不会在尾部⽤'\0'补全,查询时当然也就没有移除尾部补全的值。
⼆进制⼤对象类型(BLOB Types)
blob类型可以看成是varbinary类型,可以存储超⼤⼆进制数据。根据存储长度不同⼜分为四种: TINYBLOB, BLOB, MEDIUMBLOB,
和 LONGBLOB。
⽂本类型(Text Types)
text可以看成是varchar,可以存储超⼤的字符串数据。根据存储长度不同⼜分为四种:TINYTEXT, TEXT,MEDIUMTEXT和 LONGTEXT.
枚举类型(ENUM Type)
the evil within枚举类型主要⽤于某个列的取值只有有限的⼏个,⽐如表⽰星期⼏的列,只会是星期⼀,星期⼆,...,星期⽇这个值。可以如下创建枚举类型:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
如下插⼊⼀些数据
INSERT INTO shirts (name, size) VALUES
('dress shirt','large'),
('t-shirt','medium'),
('polo shirt','ss');
结果如下:
当插⼊的值不在枚举类型中,size中会是空⽩。可以通过索引进⾏查询:
select * from shirts where size=4
等价于
select * from shirts where size='larger'
'x-small', 'small', 'medium', 'large', 'x-large'的索引分别是1,2,3,4,NULL的索引是NULL,空字符串''的索引是0。
枚举类型中可以有65535个不同的取值。
集合类型(SET Type)
有时候,⼀个列的取值只可能是有限个值的不重复组合,如下创建集合类型CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
插⼊数据:
INSERT INTO myset (col) VALUES
('a,d'),
('d,a'),
('a,d,a'),
('a,d,d'),
('d,a,d');
mysql语句分类结果如图:
从结果来看,集合类型中的集合就是数学中的集合,满⾜⽆序和不重复。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论