文章目录

  • 文本字符串类型
    • 1. CHAR与VARCHAR类型
    • 2. 哪些情况使用 CHAR 或 VARCHAR 更好
    • 3. TEXT类型
    • 4. 开发中经验

文本字符串类型

  • 在实际的项目中,经常遇到一种数据,就是字符串数据。

  • MySQL中,文本字符串总体上分为CHARVARCHARTINYTEXTTEXTMEDIUMTEXTLONGTEXTENUMSET等类型。

1. CHAR与VARCHAR类型

CHAR和VARCHAR类型都可以存储比较短的字符串。

字符串(文本)类型 特点 长度 长度范围 占用的存储空间
CHAR(M) 固定长度 M 0 <= M <= 255 M个字节
VARCHAR(M) 可变长度 M 0 <= M <= 65535 (实际长度 + 1) 个字节

CHAR类型:

  • CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。
  • 如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
  • 定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。
CREATE TABLE test_char1(
c1 CHAR,
c2 CHAR(5)
);DESC test_char1;

INSERT INTO test_char1
VALUES('a','Tom');
SELECT * FROM test_char1;

  • CONCAT 函数时拼接两个字符串成一个字符串,测试数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度
SELECT CONCAT(c2,'***') FROM test_char1;

  • 测试:当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
INSERT INTO test_char1(c2)
VALUES('a  ');SELECT CHAR_LENGTH(c2)
FROM test_char1;

VARCHAR类型:

  • VARCHAR(M) 定义时,必须指定长度M,否则报错。
  • MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;MySQL5.0版本以上,varchar(20):指的是20字符。
  • 检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
CREATE TABLE test_varchar1(
NAME VARCHAR  #错误
);
  • VARCHAR(M)M 最大 为 21845
#Column length too big for column 'NAME' (max = 21845);
CREATE TABLE test_varchar2(
NAME VARCHAR(65535)  #错误
);
  • 一个汉字的长度就是一个字符的长度
CREATE TABLE test_varchar3(
NAME VARCHAR(5)
);INSERT INTO test_varchar3
VALUES('兮动人'),('云兮动人');

  • 超出长度,就会报错

  • 字母或数字的长度,也算一个字符的长度

CREATE TABLE test_varchar4(
name VARCHAR(6)
);INSERT INTO test_varchar4
VALUES('xdr630');

2. 哪些情况使用 CHAR 或 VARCHAR 更好

类型 特点 空间上 时间上 适用场景
CHAR(M) 固定长度 浪费存储空间 效率高 存储不大,速度要求高
VARCHAR(M) 可变长度 节省存储空间 效率低 非CHAR的情况

情况1:存储很短的信息。比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的,结果得不偿失。

情况2:固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

情况3:十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

情况4:具体存储引擎中的情况:

  • MyISAM 数据存储引擎和数据列:MyISAM数据表,最好使用固定长度(CHAR)的数据列代替可变长度(VARCHAR)的数据列。这样使得整个表静态化,从而使数据检索更快,用空间换时间。

  • MEMORY 存储引擎和数据列:MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系,两者都是作为CHAR类型处理的。

  • InnoDB存储引擎,建议使用VARCHAR类型。因为对于InnoDB数据表,内部的行存储格式并没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),而且主要影响性能的因素是数据行使用的存储总量,由于char平均占用的空间多于varchar,所以除了简短并且固定长度的,其他考虑varchar。这样节省空间,对磁盘I/O和数据存储总量比较好。

3. TEXT类型

  • 在MySQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT 类型。

  • 在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和 VARCHAR类型相同。

  • 每种TEXT类型保存的数据长度和所占用的存储空间不同,如下:

文本字符串类型 特点 长度 长度范围 占用的存储空间
TINYTEXT 小文本、可变长度 L 0 <= L <= 255 L + 2 个字节
TEXT 文本、可变长度 L 0 <= L <= 65535 L + 2 个字节
MEDIUMTEXT 中等文本、可变长度 L 0 <= L <= 16777215 L + 3 个字节
LONGTEXT 大文本、可变长度 L 0 <= L<= 4294967295(相当于4GB) L + 4 个字节
  • 由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M)。

举例:

创建数据表:

CREATE TABLE test_text(
tx TEXT
);
INSERT INTO test_text
VALUES('atguigu   ');
  • 查询其长度
SELECT CHAR_LENGTH(tx)
FROM test_text;

  • 说明在保存和查询数据时,并没有删除TEXT类型的数据尾部的空格。

4. 开发中经验

  • TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。还有TEXT类型不用加默认值,加了也没用。而且text和blob类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。

【mysql】文本字符串类型相关推荐

  1. MySQL学习(十七):数据类型之文本字符串类型

    文本字符串类型 类型 值的长度 长度范围 占用的存储空间 CHAR(M) M 0<=M<=255 M个字节 VARCHAR(M) M 0<=M<=65535 实际长度+1个字节 ...

  2. MySQL数据库基础:数据类型详解-文本字符串类型

    前言 正好趁着这次一起学习复习一下MySQL数据库的基本知识.也是一直在用这个数据库,有些基础的知识点长久不用就会遗忘,就比如数据类型溢出的问题,很多时候建表的时候随便给定个类似,结果导入数据的时候报 ...

  3. MySQL数据类型--------字符串类型实战

    1. 背景 * MySQL支持的字符串类型有CHAR.VARCHAR.二进制.var二进制.BLOB.文本等等. 2. 字符串类型所需的存储和值范围 类型 说明 N的含义 是否有字符集 最大长度 CH ...

  4. MySQL中字符串类型的字段最大使用longtext来存储

    在MySQL中存储字符串文本,我们一般会使用varchar类型.如果文本内容很多,那我们会使用text.但是记住,text并不是MySQL中存储文本信息最大的字段.如果您的项目中text还不够用,那么 ...

  5. mysql文本域类型_MySQL多个大文本域异常

    最近散仙在处理标注结果入库的结果数据时,发现再向MySQL插入text域的文本值,莫名其妙的总是报一个异常,信息如下: java.sql.SQLException: Got error 139 fro ...

  6. Mysql 给字符串类型字段 加索引方法

    前提 首先,mysql是支持前缀索引的,我们可以定义字符串的一部分作为索引. 必要性 如果你创建索引不指定前缀长度,则索引包含整个字符串,占用空间比较大, 如果我们使用好前缀索引,可以即节省空间又不会 ...

  7. mysql 转字符串类型

    字段:number  是integer类型    在表test中 select cast(number as char) as number from test; 或者convert()方法.因为转换 ...

  8. Mysql在字符串类型的日期上加上10分钟并和如今的日期做比較

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ufo2910628/article/details/32092869 SELECT id FROM ...

  9. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)

    Mysql的数据类型主要分为三类:数字类型.字符串(字符)类型.日期和时间类型,由于时间紧迫,根据学习的需要 数字类型暂不做详解,等待有时间了在修改此文档,此文主要介绍mysql 数据类型中的字符串类 ...

  10. 不全?MySQL数据类型精讲,定点日期枚举文本字符串,json二进制,空间,选择建议,完整详细可收藏

    文章目录 1. MySQL中的数据类型 2. 整数类型 3. 浮点数类型 4. 定点数类型 5. 位类型:BIT 6. 日期与时间类型 7. 文本字符串类型 8. ENUM类型 9. SET类型 10 ...

最新文章

  1. mustache语法 转自小花大方
  2. 看似简单但容易忽视的编程常识
  3. 【学习笔记】新基建/新动能——部分学习笔记
  4. c调用按钮点击事件_React中事件的写法总结
  5. 【laravel54】查看版本号3种方式
  6. 《Java 高并发》02 多线程的特性
  7. C#类类型“.NET技术”
  8. 伺服怎么接单相220伏_乐利网带你认识伺服电机及工作原理
  9. linux sh-3.2 怎么开机,linux 开机执行脚本文件
  10. 计算机信息数据集通信的概念,南京信息工程大学数据通信与计算机网络复习题库.doc...
  11. http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
  12. html如何在手机打开,HTML怎么在手机打开
  13. express-urlrewrite express url重写
  14. 请用html5标准完成以下页面布局(要求完整书写整个页面的html代码,不需要写CSS)
  15. Abbirb120型工业机器人_工控产品-ABB IRB120工业机器人-IRB120
  16. python解题时间_1小时还是30秒?Python给你的另一种数据处理选择
  17. good man or bad man?
  18. 9个最佳新闻聚合器网站(+如何构建自己的网站)
  19. 使用计算机数据采集的优点,什么是数据采集器
  20. java i18n utf_struts2.0乱码 在struts.xml里面设置struts.i18n.encoding=utf-8依然出现乱码是怎么回事呀...

热门文章

  1. 主控芯片成功案例:搭载北京君正X1000芯片,收款计算合二为一
  2. 全球与中国乳制品替代杏仁制品市场深度研究分析报告
  3. 微信代扣踩坑日记(微信自动续费)
  4. 互联网晚报 | 12月10日 星期五 | B站月均活跃UP主达270万人;宝马电动车总销量破百万;苹果市值逼近3万亿美元...
  5. 嵌入式 Linux下检索字符串命令grep
  6. python 处理excel公式_python 处理excel踩过的坑——data_only,公式全部丢失
  7. 哼唱也能识别歌名 音乐APP听歌识曲谁家强
  8. haxm device is not found
  9. 搜狗浏览器安装插件(.crx)
  10. 什么是电感器与电感?