mysql文本字符串主要包括 CHAR 、 VARCHAR 、 TINYTEXT、 TEXT、MEDIUMTEXT 、LONGTEXTENUM、SET 等类型
char用于储存固定长度的字符串(定长就是电话号码),一般需要声明字符串长度,如果你没有声明它会默认为1,在进行存储时,char函数会默认删除字符串末尾的空格,例如你存储的是'123 '注意这个字符串末尾是有两个空格的,在存储字符串数据时把这个空格删掉,也就是空格不会被存进去。
在存储数据时,数据的实际长度比char声明小,则会在右侧填充空直到符合声明的长度。
cerate table test (
c1 char(10)
c2 char (10)
)
desc test 降序排序,由大到小
INSERT INTO test (c1) VALUES('xuexisql'), 向c1列,插入字符串“xuexisql”
INSERT INTO test (c2) VALUES('csdn ') 向c2列,插入字符串“csdn ” 末尾留有两个空格
字符串 'csdn ' 留有两个空格加上四个字节(一个小写字母,占一个字节)共占据7个字节的内存,但是运行结果是占据4个字节,说明了char 类型会删除字符串末尾的空格。
varchar类型用于存储可变长的字符串(类似家庭地址变化较大),节省存储空间,由VARCHAR声明的字段数据,会保留数据尾部的空格,例如 name varchar(10)。VARCHAR类型的字段所限定字符范围为字符串实际长度加1个字节。例如存储的字符串具有10个字符,因为varchar会自动包含一个字符串结束字符所以在声明m时要写上11 varchar(11)。varchar在值保存和检索时,尾部的空格仍然保留。
#创建表 test_2,其中包含一个列 ‘name’
CREATE TABLE test_2(
NAME VARCHAR(6)
);#向‘name’ 插入两条数据 : 'xuexip' 和 'xuexipy'
INSERT INTO test_2 VALUES ('xuexip');
INSERT INTO test_2 VALUES ('xuexipy');
为什么只成功了一条数据,显示是字符串 ‘xuexip’成功了,因为第二条数据'xuexipy'超出了事先声明的范围,'xuexipy'占据了7个字符,在声=声明只是声明了6个字符。
短暂总结:char(M)和 varchar(M) 这个声明变量指的是字符的范围,而不是允许存储的字节数,数据存储时占用的字节数和数据类型相关。
varchar 在存储数据时,会分出一个空间varchar还要占个byte用于存储信息长度,例如存储,‘学习mysql’,储存样式'学习mysql11'
char和varchar的区别:
char类型用于存储固定长度的字符串,varchar类型用于存储可变长的字符串,
在SQL最新版 8.0中,无论是CHAR 和VARCHAR的存储方式是,每个英文一个字节,每个中文3字节。
char和varchar 存储数据都是非万国码(unicode)的字符数据。
2.TEXT
在SQL语言中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT 和LONGTEXT 类型。
在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和 VARCHAR类型相同
CREATE TABLE test_3(
tx TEXT # 不需要进行事先声明这一点和varchar类型是一样);
INSERT INTO test_3
VALUES('学Python来csdn '); #你储存了多少字符就是多少字符,它不会像char类型,会删除结尾的空格SELECT CHAR_LENGTH(tx)
FROM test_3; # 字符15
text数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含文本类型字段,建议单独创建一个表。
3.ENUM 枚举类型
ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。
例如:
#创建一个表 test_enum ,包含了枚举类型
CREATE TABLE test_enum(
season ENUM ('春','夏','秋','冬','fuck') # enum 需要事先声明限定值);
向test_enum表中插入数据 ,插入数据的值只能在枚举(ENUM) ('春','夏','秋','冬','fuck')的范围内
INSERT INTO test_enum
VALUES ('春'),('秋') #你只能存储 '春','夏','秋','冬','fuck' ,中的其中一个,比如 ‘春’,‘春,夏’是不行的 下标位置 1 2 3 4 5#可以使用索引进行枚举元素的调用
INSERT INTO test_enum
VALUES(1),(3); #调用元素下标为1和3元素,‘春’,‘秋’
错误示范:
INSERT INTO test_enum
VALUES ('风') 刚才声明的内容中没有 ‘风’错误提示:
错误代码: 1265
Data truncated for column 'season' at row 1
4.SET
SET 和 ENUM 用法很是相似,枚举只能存储单个数值,而且存储的数值要在声明的范围内,SET 可以存储多个数值,其存储的数值在定义事先声明的范围内
当set数值类型存储的数据中有重复数据,set 方法会自动删除重复数据保留一个。
CREATE TABLE test_set(
HR SET ('陈','小赵','何卫红')
)
#插入重复数据 ,mysql 会对set 类型成员中出现的重复数据,去重
INSERT INTO test_set (hr) VALUES ('小赵'),('小赵,何卫红')
# 错误示例: 和枚举方法一样,只能存储事先声明的成员数据,没有定义的不可以存储
总结:如遇到疑难点欢迎评论区留言