MYSQL中varchar和TEXT

起因

引发原因:门店需求新增自提门店,自提门店需要加自提点图片,在渠道店上引入了图片地址img_url 的字段,字段值定义为text not null 但是因为text字段不能设置默认值,所以未设置默认值;

上线时候先上线了数据库字段,代码还未上线,线上新增渠道店的时候导致该字段为null所以不能新增渠道店报错。

解决方案:后紧急工单更改了img_url字段设置字段类型为varchar(2000) 默认值为'' 线上可以新增渠道店;

问题分析:text和varchar

根据阿里巴巴开发手册嵩山版 MySQL 数据库篇

建表规约第八条:

【强制】 varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度

大于此值,定义字段类型为 text ,独立出来一张表,用主键来对应,避免影响其它字段索引效

第十三条:

 【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:

1) 不是频繁修改的字段。

2) 不是唯一索引的字段。

3) 不是 varchar 超长字段,更不能是 text 字段。

正例:各业务线经常冗余存储商品名称,避免查询时需要调用 IC 服务获取。

ORM 映射

第一条:

【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。

说明:1)增加查询分析器解析成本。2)增减字段容易与 resultMap 配置不一致。3)无用字段增加网络

消耗,尤其是 text 类型的字段。

mysql的官方文档

mysql的官方文档上写了varchar类型最长可以指定为65535字节,

但我们建表的时候,实际上因为指定了字符集的问题,如果是在utf8的字符编码下,实际上最大的长度只能为 21845,因为utf8一个字符占3个字节

utf8编码下
Column length too big for column 'varchar1' (max = 21845); use BLOB or TEXT instead

utf8-mb4编码下
 Column length too big for column 'varchar1' (max = 16383); use BLOB or TEXT instead
 
 但是其实65535的限制是在一行数据里面限制的总数为65535,即:
 如果我们有门店表:货号指定为21845长度,品名指定为21845长度,还是不能建表成功,因为65535的限制是一行的所有字段值加起来的限制。
 (此处不仅限制varchar,是除了BLOBs的类型都会被限制)
 会出现如下报错:Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. 
 This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

TEXT数据类型

可以存储1-4GB字节长度,MySQL并不把TEXT数据存储在内存中,而是存储与磁盘中,所以MySQL每次必须从磁盘读取,导致它比varchar要慢

TINYTEXT 255字节 (2KB)

TEXT 65,535字节 (64KB)

MEDIUMTEXT 16,777,215字节(16M)

LONGTEXT 4,294,967,295字节(4GB)

总结:

varchar字段可以设置,但不要超过5000长度

text字段可以使用,但如果非必要应尽量避免,可以采用独立表对应

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: varchartextMySQL 是两种不同的存储字符串数据的数据类型。 - varchar:存储变长字符串,最大长度为 65535 个字符。 - text:存储较长的文本数据,最大长度为 2^32 - 1 个字符。 因此,如果需要存储较短的字符串数据,可以使用 varchar,如果需要存储较长的字符串数据,则可以使用 text。 总的来说,text 占用的空间更多,但具有更高的存储容量,而 varchar 占用的空间更少,但具有较低的存储容量。因此,选择哪种类型取决于实际的存储需求。 ### 回答2: 在MySQLvarchartext都是用于存储文本数据类型的字段,它们在使用时有一些区别。 1. 存储长度:varchartext都能够存储不定长度的字符串,但是varchar有长度限制,而text没有长度限制。varchar的长度限制是指最大允许长度,例如varchar(100),表示允许存储的最大长度为100个字符;而text可以存储任意长度的字符串,最大长度取决于存储引擎。 2. 存储方式:varchartext的存储方式也不同。varchar是用于存储比较短的字符串,它会被放到表格的行,不同于其它字符型数据类型,如果varchar存储的文本数据大小超过对应的表格大小,会造成MySQL自动转成text类型。text存储的字符串通常比较长,它会被存储在表格外面的数据文件,因此text的存取速度会比varchar慢,占用的存储空间也更大。 3. 索引:varchar可以使用索引,比较方便进行查询和排序;而text类型的字段只能创建fulltext类型的索引,不能使用普通的索引。 4. 查询速度:由于varchar存储在表格,因此查询速度会比text类型的字段快,尤其是在频繁查询、大量数据时效果更加明显。 总结而言,varchar主要适用于存储较短的字符串,它具有长度限制和较快的查询速度,而text适用于存储较长的字符串,具有无长度限制和较慢的查询速度,同时只能创建fulltext类型的索引。在实际开发,应根据存储的实际情况选择使用varchartext。 ### 回答3: 在MySQLVARCHARTEXT都是用来存储字符数据类型的字段。它们的区别在于存储大小和存储方式。 1. 存储大小 VARCHAR的存储大小是固定的,它需要指定一个最大长度,在实际应用,它只会占用实际存储的字符数加上一些额外的字节来存储长度信息。例如,如果将一个长度为10的VARCHAR字段设置为“Hello World”,MySQL将使用12个字节来存储它(10字节用于存储实际数据,2字节用于存储长度信息)。 而TEXT的存储大小是可变的,可以存储任何长度的文本数据。对于较长的文本数据,TEXT类型比VARCHAR类型更适合。 2. 存储方式 VARCHAR是以字符串的形式存储,而TEXT是以二进制大对象(BLOB)的形式存储。因此,在进行一些操作时,VARCHAR具有更高的性能。 另外,当涉及到排序和查找时,VARCHAR要比TEXT具有更好的性能,因为VARCHAR可以使用索引来进行优化,而TEXT则不能。 总体来说,VARCHAR适用于存储短字符串(一般少于255个字符),而TEXT适用于存储较长的文本信息,如博客文章、新闻内容等。但是,要根据具体情况和数据库的需求来选择合适的数据类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值