MySQL 文本字符串

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 ('小赵'),('小赵,何卫红')

 # 错误示例: 和枚举方法一样,只能存储事先声明的成员数据,没有定义的不可以存储

 总结:如遇到疑难点欢迎评论区留言

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值