首页 > 其他分享 >查询表结构 类型

查询表结构 类型

时间:2023-12-14 14:00:49浏览次数:23  
标签:存储 varchar 查询 字段 65535 类型 长度 结构

select COLUMN_NAME,COLUMN_TYPE from information_schema.columns where table_name ='t_advice_core' order by `ORDINAL_POSITION`
SHOW VARIABLES LIKE 'character_set%'
mysql的varchar字段最大长度真的是65535吗?

在mysql建表sql里,我们经常会有定义字符串类型的需求。

CREATE TABLE `user` (  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;

比方说user表里的名字,就是个字符串。mysql里有两个类型比较适合这个场景。

char和varchar。

声明它们都需要在字段边上加个数组,比如char(100)varchar(100),这个100是指当前字段能放的最大字符数

那问题来了,声明varchar字段时,它的最大长度是多少呢?

相信大家应该听说过varchar字段的最大长度是65535吧。

没听过也没关系,你现在听到了。

但实际上是这样吗?我们慢慢分析。。。

虽然通常认为VARCHAR字段的最大长度是65535,但实际上这个说法是不完全准确的。这是因为,在MySQL中,VARCHAR字段的最大长度取决于多个因素,包括字符集、行格式和存储引擎等。下面我们将对这些因素进行详细说明。

一、行格式的影响

MySQL 中的行格式是指在存储数据时,将数据按照一定的方式组织成行的格式。常见的行格式有固定长度行格式(Fixed-length format)和动态行格式(Dynamic format)

在固定长度行格式中,每一行都有固定的长度,每个字段的长度都是固定的。而在动态行格式中,每一行的长度都是根据数据的实际长度而定,字段长度也是根据数据的实际长度来动态调整的。因此,使用不同的行格式,对于 varchar 字段的最大长度有不同的影响。

在固定长度行格式中,varchar 类型字段的最大长度确实是 65535。因为在固定长度行格式中,每个字段都占用固定的空间,varchar 类型字段的长度也是固定的,所以其最大长度是受到限制的。

而在动态行格式中,varchar 类型字段的最大长度是根据实际数据长度而定的,不受到固定长度的限制。因此,在动态行格式中,varchar 类型字段的最大长度可以超过 65535。

示例:

假设我们有一个包含一个 varchar 类型字段的表,行格式为 Dynamic,字符集为 utf8mb4。我们插入一个长度为 80000 的字符串:

CREATE TABLE `test` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `value` varchar(80000) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;INSERT INTO `test` (`value`) VALUES (REPEAT('a', 80000));

在这个例子中,我们插入了一个长度为 80000 的字符串,而在 Dynamic 行格式下,这个字符串可以被正确地存储,没有出现错误。

二、字符集的影响

MySQL 支持多种字符集,包括 ASCII、ISO-8859、utf8mb4 等。不同的字符集对于 varchar 类型字段的最大长度也有不同的影响。

在 ASCII 和 ISO-8859 字符集中,一个字符只占用一个字节的空间,因此 varchar 类型字段的最大长度是 65535 个字节。而在 utf8mb4 字符集中,一个字符可能占用 1 到 4 个字节的空间,因此 varchar 类型字段的最大长度也就不再是固定的,而是根据字符集的不同而有所不同。

示例:

我们继续以 utf8mb4 字符集为例,考虑长度为 80000 的字符串在 varchar 类型字段中的最大长度。

在 utf8mb4 字符集下,每个字符可能占用的字节数不同,最大为 4 个字节。因此,如果我们使用 utf8mb4 字符集,那么 varchar 类型字段的最大长度是 65535/4=16383。

CREATE TABLE `test` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `value` varchar(16383) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;INSERT INTO `test` (`value`) VALUES (REPEAT('你', 80000));

在这个例子中,我们将 varchar 类型字段的最大长度设为 16383,在 utf8mb4 字符集下,一个字符最多占用 4 个字节,因此这个字段最大能存储的字符串长度为 16383。但是我们插入了一个长度为 80000 的字符串,MySQL 报错:

ERROR 1406 (22001): Data too long for column 'value' at row 1

这是因为插入的字符串长度超过了我们定义的最大长度。

三、存储引擎的影响

MySQL 支持多种存储引擎,包括 InnoDB、MyISAM、Memory 等。不同的存储引擎对于 varchar 类型字段的最大长度也有不同的影响。

在 InnoDB 存储引擎中,varchar 类型字段的最大长度是受到限制的,最大长度为 65535。而在 MyISAM 存储引擎中,varchar 类型字段的最大长度可以达到 65535/2=32767。

示例:

我们以 InnoDB 和 MyISAM 存储引擎为例,分别考虑长度为 80000 的字符串在 varchar 类型字段中的最大长度。

在 InnoDB 存储引擎下,varchar 类型字段的最大长度是受到限制的,最大长度为 65535。因此,在 InnoDB 存储引擎下,我们需要将 varchar 类型字段的长度设为 65535 或更小。

 `id` int(11) NOT NULL AUTO_INCREMENT,  `value` varchar(65535) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;INSERT INTO `test_innodb` (`value`) VALUES (REPEAT('a', 65535));

在这个例子中,我们将 varchar 类型字段的长度设为 65535,在 InnoDB 存储引擎下,这个字段最大能存储的字符串长度就是 65535。

而在 MyISAM 存储引擎下,varchar 类型字段的最大长度可以达到 65535/2=32767。因此,在 MyISAM 存储引擎下,我们可以将 varchar 类型字段的长度设为 32767 或更小。

CREATE TABLE `test_myisam` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `value` varchar(32767) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;INSERT INTO `test_myisam` (`value`) VALUES (REPEAT('a', 32767));

在这个例子中,我们将 varchar 类型字段的长度设为 32767,在 MyISAM 存储引擎下,这个字段最大能存储的字符串长度就是 32767。

需要注意的是,在 MySQL 5.7.5 之前的版本中,MyISAM 存储引擎也存在最大行长度的限制,因此即使在 MyISAM 存储引擎下,varchar 类型字段的最大长度也不一定能够达到 65535/2=32767。在 MySQL 5.7.5 之后,MyISAM 存储引擎的最大行长度限制被取消,因此 varchar 类型字段的最大长度可以达到 65535/2=32767。

标签:存储,varchar,查询,字段,65535,类型,长度,结构
From: https://www.cnblogs.com/jason-zhao/p/17901035.html

相关文章

  • 编写一个程序,记录捐助给“维护合法权利团体”的资金。该程序要求用户输入捐献者数目,然
    编写一个程序,记录捐助给“维护合法权利团体”的资金。该程序要求用户输入捐献者数目,然后要求用户输入每一个捐献者的姓名和款项。这些信息被储存在一个动态分配的结构数组中。每个结构有两个成员:用来储存姓名的字符数组(或string对象)和用来存储款项的double成员。读取所有的......
  • 数据结构只因屑化
    好像一直在做这个。然而。。。。越来越感觉这个东西不适合用来打OI了。虽然还没有整出来。只是用来确保复杂度还差不多。也就是学术用途吧(?)核心大致的思想朴素而不完备。主要适用于偏序类的东西,或者区间第k大之类的伪不可合并信息。枚举每一维,整一个高维树套树。对......
  • 四、ts高级类型
    四、ts高级类型四、ts高级类型今天也是一个小透明关注IP属地:青海0.1032022.03.0722:50:41字数2,354阅读2,398主要:class类、类型兼容性、交叉类型、泛型和keyof、索引签名类型和索引查询类型、映射类型1、class类ts全面支持es6的class关键字,并为其添加了类型注解和......
  • 实验6 C语言结构体、枚举应用编程
    实验任务41#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9intsales_count;......
  • 11种编程语言中,返回多个不同类型的方法样例
    本文分享自华为云社区《多语言编程返回多个不同类型的方法样例》,作者:张俭。背景你可能会在一些场景下碰到需要返回多个不同类型的方法。比如协议解析读取报文时,更具体地像kubernetes在开始解析Yaml的时候,怎么知道这个类型是属于Deployment还是Service?CC语言通常通过使用Str......
  • 内存堆栈结构
    参考:秒懂栈内存和堆内存(深入底层)(xjx100.cn)堆栈与堆(StackvsHeap):有什么区别?图文并茂拆解代码解析!-知乎(zhihu.com)学习CLRviaC#(二)-类型基础-CSDN博客我们都知道值类型存在“栈”中,引用类型存在“堆”中。这篇文章深入讨论下内存的栈和堆的结构。1.前言1.指针人......
  • 实验6 C语言结构体、枚举应用编程
    1.实验任务1【验证性实验】2.实验任务2【验证性实验】3.实验任务3【验证性实验】4.实验任务4task4源代码:1#include<stdio.h>2#include<stdlib.h>3#defineN1045typedefstruct{6charisbn[20];//isbn号7charname[80];......
  • 基本数据类型
    内容概要八大基本数据类型数字类型整数(int)浮点数(float)字符串类型(str)列表类型(list)字典类型(dict)dictionary布尔类型(bool)元组类型(tuple)集合类型(set)【一】整型(int)(1)类型强转可以将由纯整数构成的字符串直接转换成整型符合int类型格式的字......
  • Redis数据结构4:REDIS_ZIPLIST
    REDIS_ZIPLISTzipList(压缩列表)是一种紧凑型的数据结构,占用一片连续的内存,本质上是一个字节数组。能提高CPU缓存的利用效率,并且针对不同数据结构进行不同编码,节省内存开销。编码结构zipList的字节数组主要由5个部分组成:zlbytes、zltail、zllen、zltail和entry。zlbytes记录......
  • Hadoop 数据类型及序列化
    1.Hadoop数据类型Java类型HadoopWritable类型BooleanBooleanWritableWritableWritableWritableWritableWritableWritableWritableWritableWritable2.为何Hadoop有自身序列化与反序列化Java自身的序列化除去本身Bean的数据......