MYSQL中varchar和TEXT的相关问题详析
作者:Lee5488 发布时间:2024-01-23 00:58:42
起因
引发原因:门店需求新增自提门店,自提门店需要加自提点图片,在渠道店上引入了图片地址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字段可以使用,但如果非必要应尽量避免,可以采用独立表对应
来源:https://blog.csdn.net/dongying1751/article/details/126148104


猜你喜欢
- 每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式。 举个例子,在这行URLConf中:(r'^artic
- 1. 加载数据集这次我们搭建一个小小的多层线性网络对糖尿病的病例进行分类首先先导入需要的库文件先来看看我们的数据集观察可以发现,前八列是我们
- anaconda用法:查看已经安装的包:pip list 或者 conda list安装和更新:pip install requestspi
- 目录1、封装1.1 私有属性和私有方法2、继承2.1 方法的重写2.2 在子类方法中调用父类方法2.3 多继承2.4 新式类和经典类3、多态
- 网络开发的在分页上要是遇到数(几十)万以上的数据还是用ADO那样的分页会速度很慢的。有了存储过程速度就快多了。下面是本人用50万的数据进行的
- 学习目标根据原型设计编译自动化数据生成器,熟悉wxPython的基本用法。界面原型设计界面原型设计分析输入参数:最大长度最小长度组成规则多少
- 近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对web
- ● 脚本用途遍历文件夹下的文件,消除文件名前的特征字符串。● 脚本实现import os,sysimport refrom string i
- 1.插入数据insert into表名(列名1,列名2,列名..) values(值1,值2,值...); insert into
- Go批处理语句用于同时执行多个语句使用、切换数据库use mastergo创建、删除数据库方法1、--判断是否存在该数据库,存在就删除if
- 本文实例讲述了Python递归及尾递归优化操作。分享给大家供大家参考,具体如下:1、递归介绍递归简而言之就是自己调用自己。使用递归解决问题的
- golang中GOPATH的简单理解 1、为什么要配置GOPATH配置GOPATH的用意是为了方便项目的部署和构建,以及可以直接使用go g
- 为庆祝jQuery的四周年生日,jQuery官方团队正式发布了jQuery 1.4版本。在这个版本中,jQuery官方团队做了大量的编码、测
- 在上一篇文章: 觉得猪八戒网左下角的文字滚动,效果不错,自己摸索了一下,以自己的方法实现了!就有这种效果,不过影响不大。Demo的影响就大了
- 使用sql语句删除数据库中重复记录的两个方法如下:方法一declare @max integer,@id in
- ASP在线压缩ACCESS数据库原理很简单:利用JRO.JetEngine的压缩功能建立一个新的数据库文件,然后把原来的删掉、替换!既然这样
- 有别于JS跨域、IFRAME跨域等的常用处理办法,还可以利用P3P来实现跨域。P3P是什么P3P(Platform for Privacy
- 本文主要研究的是用Python语言建立Map写Excel表的相关代码,具体如下。前言:我们已经能够很熟练的写Excel表相关的脚本了。大致的
- 实现代理的方式很多种,流行的web服务器也大都有代理的功能,比如http://www.tornadoweb.cn用的就是nginx的代理功能
- 记录一下PHP连接MySQL的两种方式。先mock一下数据,可以执行一下sql。/*创建数据库*/CREATE DATABASE IF NO