列的类型定义——字符串类型

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 列的类型定义——字符串类型

一、CHAR 类型和 VARCHAR 类型

CHAR类型和VARCHAR类型都在创建表时指定了最大长度,其基本形式如下:


1.字符串字符(M)


   其中,“字符串类型”参数指定了数据类型为CHAR类型还是VARCHAR类型;M参数指定了该字符串的最大长度为M。例如,CHAR(4)就是数据类型为CHAR类型,其最大长度为4。


       CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0~255的任意值。例如,CHAR(100)就是指定CHAR类型的长度为100。CHAR 存储值时,它们会用空格右填充到指定的长度。


       VARCHAR类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取0~65535之间的任意值。指定VARCHAR类型的最大值以后,其长度可以在0到最大长度之间。例如,VARCHAR(100)的最大长度是100,但是不是每条记录都要占用100个字节,而是在这个最大值范围内使用多少就分配多少。VARCHAR类型实际占用的空间为字符串的实际长度加1或2,这样即可有效节约系统的空间

CHAR(4)

存储字节数

VARCHAR(4)

存储字节数

‘’

‘’

4

‘’

1

‘ab’

‘ab’

4

‘ab’

3

‘abcd’

‘abcd’

4

‘abcd’

5

‘abcdefgh’

-

#插入失败

-

#插入失败


mysql> use test;   #选择数据库test


mysql> create table char_example(e_char char(5), v_char varchar(5)); #创建数据库表


mysql> insert into char_example values('12345','12345');  #正常插入数据


mysql> insert into char_example values('1 2  ','1 2  ');   #char类型会屏蔽后面隐藏的空格,varchar 不会


mysql>select concat('(',e_char, ')'), concat('(',v_char, ')')  from char_example ; #让char 后面屏蔽的空格原型毕露


2.实战类型


1、 char一定会使用指定的空间,varchar是根据数据来定空间

2、 char的数据查询效率比varchar高:varchar是需要通过后面的记录数来计算

3、  如果确定数据一定是占指定长度,那么使用char类型;

4、  如果不确定数据到底有多少,那么使用varchar类型;

5、  如果数据长度超过255个字符而在65535之内,直接使用varchar

6、  如果字符串尾部要保留空格,必须选择varchar


二、TEXT 类型

1.类型表

       TEXT类型是一种特殊的字符串类型,包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,其长度和存储空间的对比下表所示:


9f14e10bcd494b40835067be26d895c8.png


各种TEXT类型的区别在于允许的长度和存储空间不同。因此,在这几种TEXT类型中,根据需求选取既能满足需要又节省空间的类型即可。


2.特别注意


1)以上各类型无须指定长度!


2)允许的长度是指实际存储的字节数,而不是实际的字符个数,比如假设一个中文字符占两个字节, 那么TEXT 类型可存储 65535/2 = 32767  个中文字符,而varchar(100)可存储100个中文字  符,实际占200个字节,但varchar(65535) 并不能存储65535个中文字符,因为已超出表达范围。

mysql> use test;   #选择数据库test


mysql> create table text_example(e_text tinytext, v_char varchar(255)); #创建数据库表,e_text 可存储255个字节,v_char可存储255个字符  


mysql> insert into char_example values(90个中文字符,90个中文字符);  #插入失败,utfmb4 用3个字节表示一个中文汉字,会超出tinytext 保存范围


mysql> insert into char_example values(80个中文字符,100个中文字符);  #插入成功    

3.实战建议


1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。超过255字节的只能用varchar或者text;

2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。

3、 text不设置长度, 当不知道属性的最大长度时,适合用text, 能用varchar的地方不用text;

4、 如果都可以选择,按照查询速度: char最快, varchar次之,text最慢。


4.实战练习

创建一个用户信息表,用来存储用户的如下信息:姓名,手机号码,家庭地址,个人简介,性别,年龄,身份证号。数据库表名可定义为userinfo, 同时增加一个列id 用来作为每一条记录的唯一标识,并设为主键,自加!

mysql> use test;   #选择数据库test


mysql> create table userinfo (


id int(11) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键’,


name   varchar(64) DEFAULT NULL COMMENT ‘姓名’,


mobile  char(11)  DEFAULT NULL COMMENT ‘手机号码’,


address varchar(128) DEFAULT NULL COMMENT ‘居住地址’,


description text  DEFAULT NULL COMMENT ‘个人简介-不知道具体的范围,不常更新用text’,


sex     char(1)  DEFAULT NULL COMMENT ‘性别 - 男或女’,


age     tinyint unsigned DEFAULT 0 COMMENT ‘年龄’,


idno    char(18) DEFAULT NULL COMENT ‘身份证号码’


);  

三、ENUM 和 SET 类型

1.ENUM类型

 ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下:


   属性名  ENUM('值1',  '值2', …, '值n')


       其中,“属性名”参数指字段的名称,“值n”参数表示列表中的第n个值。ENUM类型的值只能取列表中的一个元素。其取值列表中最多能有65535个值。如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。列表中的每个值独有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。默认编号从1开始!


       Enum(‘男’,’女’,‘选择保密’)  # ‘男’=>1  ‘女’=>2  ‘选择保密’=> 3


mysql> use test;   #选择数据库test


mysql> create table enum_example (e_enum enum('男','女','选择保密') ); #创建表


mysql> insert into enum_example values('男');  #插入记录,必须是enum 选项中的值


mysql> insert into enum_example values(1);  #插入记录可以用数值表示


mysql>select e_enum + 0  from enum_example; #查询enum 选项对应的整数值


如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个元素。如果不加NOT NULL属性,ENUM类型将允许插入NULL,而且NULL为默认值。


2.SET类型

  在创建表时,SET类型的取值范围就以列表的形式指定了,其基本形式如下:


   属性名  SET('值1',  '值2', …, '值n')


       其中,属性名参数指字段的名称,“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是由64个元素构成的组合。

mysql> use test;   #选择数据库test


mysql> create table set_example (interest set('足球','追剧','篮球','撩妹') ); #创建表


mysql> insert into set_example values( '足球,撩妹' ); #插入记录,必须是enum 选项中的值


mysql> insert into enum_example values(9);  #插入相应位效果等同,9 =>1001 选择1,4


mysql>select interest+0 from set_example;  #以整数的方式查询


总结


char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。超过255字节的只能用varchar或者text;

2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。

3、 text不设置长度, 当不知道属性的最大长度时,适合用text, 能用varchar的地方不用text;

4、 如果都可以选择,按照查询速度: char最快, varchar次之,text最慢。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
网络安全 Python
这个错误是由于在将字符串类型的值转换为字典类型时出现了问题
【2月更文挑战第20天】这个错误是由于在将字符串类型的值转换为字典类型时出现了问题
15 1
|
5月前
|
JavaScript 前端开发 编译器
TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型
TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型
47 1
|
5月前
转成String类型的几种方式
转成String类型的几种方式
45 0
|
5月前
|
存储 Go
Go 语言的基础数据类型:整数类型、浮点数类型、布尔类型、字符串类型等
Go 语言的基础数据类型:整数类型、浮点数类型、布尔类型、字符串类型等
41 0
Go 语言的基础数据类型:整数类型、浮点数类型、布尔类型、字符串类型等
|
8月前
5.3.2.2 操作字符串类型数据
5.3.2.2 操作字符串类型数据
31 0
|
11月前
|
存储 关系型数据库 MySQL
列的类型定义——浮点类型和定点数类型
前言 数据表中用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型)。定点数类型就是DECIMAL型。下面从这三种类型的字节数、取值范围等方面进行对比,如下表所示。
|
11月前
|
SQL 关系型数据库 MySQL
列的类型定义——整形类型
列的类型定义——整形类型
|
11月前
|
存储 关系型数据库 MySQL
尽量使用数值替代字符串类型
尽量使用数值替代字符串类型
|
11月前
|
存储 关系型数据库 MySQL
列的类型定义——二进制类型
列的类型定义——二进制类型
|
存储 关系型数据库 MySQL
四、尽量使用数值替代字符串类型
四、尽量使用数值替代字符串类型
45 0