MYSQL中varchar和TEXT的相关问题详析

 更新时间:2022年12月15日 11:07:51   作者:Lee5488  
varchar 和 text 是 MySQL 字符存储争议比较多的领域,下面这篇文章主要给大家介绍了关于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)

附:MYSQL中varchar和TEXT差异点

text 字段,MySQL不允许有默认值。建立索引必须给出前缀索引长度。

varchar 允许有默认值,对索引长度没限制。

注:InnoDB 引擎单一字段索引的默认长度最大为 767 字节,MyISAM 为 1000 字节。例如字符编码是 utf8,那么 varchar 的索引最大长度是 256 个字符。超出限制会导致索引创建不成功,转而需要创建前缀索引。设置InnoDB_large_prefix = 1 可以增大限制,允许索引使用动态压缩,但是表的 row_format 必须是 compressed 或者 dynamic。可以使索引列长度大于767bytes,但是总长度不能大于 3072 bytes。

总结:

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

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

到此这篇关于MYSQL中varchar和TEXT的文章就介绍到这了,更多相关MYSQL varchar和TEXT内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql下修改engine引擎的方法

    mysql下修改engine引擎的方法

    修改mysql的引擎为INNODB,可以使用外键,事务等功能,性能高。
    2011-08-08
  • MySQL常用的日期时间函数汇总(附实例)

    MySQL常用的日期时间函数汇总(附实例)

    日期时间处理对大家来说应该都不陌生了,下面这篇文章主要给大家介绍了关于MySQL常用的日期时间函数,文中通过图文介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • MySQL8.0高可用MIC的实现

    MySQL8.0高可用MIC的实现

    本文介绍了如何实现MySQL8.0高可用MIC,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • SQL update多表关联更新方法解读

    SQL update多表关联更新方法解读

    这篇文章主要介绍了SQL update 多表关联更新方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • mysql函数之常见数学函数示例详解

    mysql函数之常见数学函数示例详解

    文章总结了多个数学和字符串处理函数的功能和使用示例,包括格式化数字、计算绝对值、平方根、取整、生成随机数、四舍五入、截断、返回符号、幂运算以及最大值最小值的计算,感兴趣的朋友一起看看吧
    2025-03-03
  • mysql 字符串函数收集比较全

    mysql 字符串函数收集比较全

    mysql 字符串函数收集,需要的朋友可以参考下。
    2010-03-03
  • 基于mysql多实例安装的深入解析

    基于mysql多实例安装的深入解析

    本篇文章是对mysql多实例安装进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • SQL如何获取目标时间点或日期的方法实例

    SQL如何获取目标时间点或日期的方法实例

    日期获取在我们日常开发中经常会遇到,这篇文章主要给大家介绍了关于SQL如何获取目标时间点或日期的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • MySQL出现错误代码:1055的三种解决方案(推荐!)

    MySQL出现错误代码:1055的三种解决方案(推荐!)

    当我们在查询时使用group by语句,出现错误代码:1055;执行发生错误语句,本文给大家介绍了MySQL出现错误代码:1055的三种解决方案,文中有详细的代码示例和图文供大家参考,需要的朋友可以参考下
    2024-05-05
  • MySQL缓存的查询和清除命令使用详解

    MySQL缓存的查询和清除命令使用详解

    这篇文章主要介绍了MySQL缓存的查询和清除命令使用详解,对于一些不常改变数据且有大量相同sql查询的表,查询缓存会显得比较有用一些,需要的朋友可以参考下
    2015-12-12

最新评论