字符串类型是在数据库中存储字符串的数据类型,字符串类型包括char,varchar,text,enum和set。

OK,我们来一个一个的看下上面提到的几种类型。

  • char类型和varchar类型

char类型和varchar类型都是在创建表时指定了最大长度,其基本形式如下:字符串类型(M)。其中,字符串类型参数指定了数据类型是char类型还是varchar类型,M参数指定了该字符串的最大长度为M。举个例子,char(4)就是指数据类型是char类型,其最大长度为4。

char类型的长度是固定的,在创建表时就指定了,其长度可以是0~~255的任意值。

比如,char(100)就是指定char类型的长度为100。

varchar类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取0~~65525之间的任意值。指定了varchar类型的最大值以后,其长度可以在o到最大长度之间。

比如,varchar(100)的最大长度是100,但是,不是每条记录都要占用100个字节。而是在这个最大值范围内,使用多少分配多少,varchar类型实际占用的空间为字符串的实际长度加一。这样,即可有效节约系统的空间。

现在我们在这里举一个例子,我们向char(5)和varchar(5)中存入不同长度的字符串。现在我们将数据库中的存储形式和占用的字节数进行对比,如下图。


关于上图的解释:

1,不管我们插入的字符串是什么样子,char(5)所占用的空间都是5个字节。我们前面也说过了,char类型的长度固定

2,varchar(5)所占的字节数是实际长度的基础上加1。因为字符串的结束标识符占用了一个字节呢。比如说上表中的第四行,varchar将字符串‘123 ’最后面的空格依然保留着。

为了确认下空格是否保留,我们现在将数据后面模拟加上‘*’字符,然后来实际操作下数据库中的char类型和varchar类型。建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` CHAR(5) NULL,
  4. `b` VARCHAR(5) NULL,
  5. PRIMARY KEY (`id`));

现在我们往数据库中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('1','','');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('2','1','1');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('3','123','123');
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('4','123 ','123 ');
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('5','12345','12345');
  6. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('6','1234567','1234567');

模拟数据库数据显示如下:

总结:上面的实践证明了一个结论,varchar类型将‘123 ’最后面的空格保留着,而char类型中‘123 ’后面的空格自动删除啦。

char类型和varchar类型是我们最为常用的2种字符串类型,关于这2种类型有如下2点特殊说明:

1,如果插入的字符串的长度已经大于了可以插入的最大值,那么这个时候数据库会报错,说data too long for column。
比如说,现在我们定义2个char类型和varchar类型的字段,长度都为5,但是我们插入的值是‘123456’,那么系统就会阻止这个值的插入然后报错。
关于插入的字符串长度大于数据定义的长度这个问题,资料上是上面这么说的,然后平时编码中使用ORM的时候也明确的遇见过这个错误。
但是我实际sql实践中,比如上面的插入数据库中的最后一条数据,数据库做了截取操作,并没有报错,而是一个警告,控制台输出如下:

Data truncated for column 'a' at row 1。 Data truncated for column 'b' at row 1

2,我们定义长度的时候定义的数据长度,定义的长度就是字符串最大的长度,举个例子,我定义一个name字段,varchar(6),那么该字段最多可以容纳6个汉字。
这点别和Oracle的varchar2类型的字段搞混淆了。Oracle中的字符串类型2个字节表示一个汉字。
举个例子,还是上面的建表语句,现在往其中插入一条字符串的数据,一个超过了字符串定义的长度5,一个没有超过,结果超过的字符串被截断啦。

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`, `b`) VALUES ('6','我爱你','我爱你我爱你');

数据库现在显示如下:


  • text类型

text类型是一种特殊的字符串类型。text只能保存字符数据,如新闻的内容等。

text类型包括tinytext,text,mediumtext,longtext。现在将从4种text类型允许的长度和存储空间进行对比,如下图:


text类型总结:

这种字符串类型实际中使用并不是太多,一般用来直接存储一个比较大的文本,比如说一篇文章,一篇新闻。

从上图也可以看出,各种text类型的区别在于允许的长度和存储空间不同。因此在这几种text类型中,根据需求选取技能满足需要又能节约空间的类型即可。

  • enum类型

enum类型又称为枚举类型,在创建表时,enum类型的取值范围就以列表的形式指定了。其基本形式如下:属性名 enum('值1','值2',...,'值n'),其中属性名参数指定字段的名称,‘值n’参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。注意:

1,enum类型的值只能去列表中的一个元素,其取值列表中最多只能有65535个值。列表中的每个值都有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。
2,如果enum类型加上了not null属性,其默认值为取值列表中的第一个元素。如果不加not null属性,enum类型将允许插入null,而且null为默认值。

OK,现在我们来实际模拟下MySQL中这种数据类型。

建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` ENUM('man', 'woman') NULL,
  4. PRIMARY KEY (`id`));

现在我们往数据库中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 'man');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 'woman');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', null);
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '2');
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '1');
  6. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 'huhu');

现在数据库显示如下:

OK,关于enum类型的总结:

1,使用enum类型,数据库中实际存储的每个枚举的编号,而不是列表中的值,所以我们也可以直接插入每个枚举的编号。
2,实际的实践中,如果我没有在该not null的枚举值上面插入值,或者是随便插入一个值,数据库存储的都为空。
3,实际存储中,如果只能选取列表中的一个值,就选择enum类型,如果需要选取列表中多个值的组合,就需要选择set类型。

  • set类型

上面也说到了,如果需要选取列表中多个值的组合,就要选择set类型。在创建表时,set类型的取值范围就以列表的形式指定了。其基本形式如下:属性名 set('值1','值2',....,'值n')。其中,‘属性名’属性指定字段的名称,‘值n’参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与enum类型一样。注意:

1,set类型的值可以去列表中的一个元素或者多个元素的组合。去多个元素时,不同元素之间用逗号隔开。set类型的值最多只能有64个元素构成。

2,同enum类型一样,列表中的每个值都有一个顺序排列的编号,MySQL中实际存储的是这个编号,而不是列表中的值。

3,插入记录时,set字段中的元素顺序无关紧要,存入MySQL数据库后,数据库系统会自动按照定义时的顺序显示。OK,现在我们来实际操作下数据库这种数据类型:
建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` SET('a', 'b', 'c', 'd') NOT NULL,
  4. PRIMARY KEY (`id`));

插入几条语句:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 'a');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 'c');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 'a,b');
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 'a,b,c,d');
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', 'a,e');

数据库显示如下:

关于set类型的总结:

1,set类型和enum类型对于取值在一定范围的离散值很有效。enum类型只能在取值列表中取一个值,set类型可以在取值列表中去多个值。

2,这两种类型的数据都不是直接将数据存入数据库,而是将其列表中的编号存入数据库。

3,资料中说如果随便往这2种类型中插入数据,会报错,但是我自己的实践中并没有报错,而是插入一个null。

4,对于set的话,如果插入多个值,其中有些值合法,有些值不合法,那么只会将合法的插入进去,不合法的不做处理。

 

mysql字符串类型数据的更多相关文章

  1. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  2. mysql中的字符串类型数据索引优化

    摘自 "高性能mysql" 对于一些字符串类型较长的字段搜索时, 可以参考如下方法

  3. MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

  4. mysql字符串类型(枚举类型)

    原文链接:https://blog.csdn.net/qq_34530405/article/details/81738907 本文记录MySql数据库中enum类型数据的使用细节和注意事项. 首先在 ...

  5. MySQL字符串类型转换时间类型

    如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...

  6. MySQL varchar类型数据转tinyint类型

    在mysql数据库中性别字段以前存的是'男'和'女',使用varchar类型存储的,但是在我mongo库中这个字段使用的是'1'和'0'存储的,在两个库之间的数据转换就很不方便,于是想要统一存储类型, ...

  7. 学习笔记:MySQL字符串类型

    字符串类型 a)         char和varchar 1.都需要指定字符的长度,char中的长度是字符的长度,而varchar的长度是字节的长度 2. char中指定的长度就是实际占用的长度,而 ...

  8. mysql 字符串类型 char varchar

    字符类型用在存储名字.邮箱地址.家庭住址等描述性数据   char指的是定长字符,varchar指的是变长字符 #官网:https://dev.mysql.com/doc/refman/5.7/en/ ...

  9. mysql字符串类型(char,varchar)

    原文链接:https://blog.csdn.net/puqutogether/article/details/45648879 MySQL中的字符串有两个常用的类型:char和varchar,二者各 ...

随机推荐

  1. HDU-1004.Let the ballon Rise(STL-map)

    2019-02-28-08:56:03 初次做本题是用字符串硬钢,最近校队训练时又遇到才知道用map是真的舒服.需要注意的是map的用法. clear : 清除map中的所有元素,map.clear( ...

  2. 【转】收集 jetty、tomcat、jboss、weblogic 的比较

    jetty Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开 ...

  3. OSPF网络类型不一致路由无法计算的问题

    晚上割接,远端的ASR9001-s网络类型为广播类型,本端为6509-e,网络接口类型修改成p2p后,OSPF邻居关系建立,但是路由无法计算.

  4. JavaScript各种继承方式(四):原型式继承(prototypal inheritance)

    一 原理 利用工具函数,通过原型对象直接得到父类的实例,并当作子类对实例使用. function inherit(obj){ // 在闭包中创建子类,对外隐藏子类 function Temp(){ } ...

  5. IE浏览器调试工具不能使用

    Mac 使用VMware Fusion虚拟机,安装Windows 7 Service Pack 1 (SP1). 移除自带的IE8,下载并安装IE11(64位). IE 11 调试工具不能使用,并且调 ...

  6. vue params和query传参区别

    参考地址:https://blog.csdn.net/bluefish_flying/article/details/81011230 router.js中 路由设置这里, 当你使用params方法传 ...

  7. python脚本linux上后台执行

    1.脚本后加& 加了&以后可以使脚本在后台运行,这样的话你就可以继续工作了.但是有一个问题就是你关闭终端连接后,脚本会停止运行 python3 run.py >/dev/null ...

  8. 关于MYSQL字符集问题(一)

    MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). 对于字符集的支持细化到四个层次: 服务器(se ...

  9. Mysql数据库(一)

    一 什么是数据库 一般来说,所有的数据都要存储在硬盘中,为了方便对这些数据的管理因此就出现了例如MySQL SQLserver oracle等数据库管理软件. 数据库中的数据按一定的数据模型组织.描述 ...

  10. sqlserver数据库的物理存储格式和逻辑存储格式

    物理存储结构: 数据库文件在磁盘上的存储形式: 主数据文件:*.mdf.用来存储数据库的启动信息.存储部分或全部的数据.整个的数据库只能有一个主数据文件 辅助数据文件:*.ndf.用于存储主数据文件未 ...