Mysql中的varchar

时间:2021-08-24
本文章向大家介绍Mysql中的varchar,主要包括Mysql中的varchar使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

两点声明:

  1.   MySQL要求一个行的定义长度(所有字段长度的和)不能超过65535
    1.   单个字段如果大于65535,则需要转为转换为TEXT 类型存储。
    2.   单行最大限制为65535,这里不包括TEXT、BLOB。
  2.   数据库中 gbk编码一个字符占用2个字节,utf8编码一个字符占3个字节,utf8mb4编码一个字符占4个字节

详细描述:

示例1:

当创建 字符集类型为 utf8mb4字段可以为 NULL 值只有 1 个 varchar 字段 的表时:

SQL:

CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=utf8mb4;  

错误:

[Err] 1074 - Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead  

解析:

varchar字段数据最大长度
= 一行记录最大的数据大小(字节) / 字符集表示一个字符时的最大大小(字节)
= (最大行记录大小(65535 字节) 记录数据真实长度信息(2 字节) - NULL 值标识(1 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))

即:VARCHAR 字段类型最多能存储的数据长度 = (65535 - 2 - 1) / 4 = 16383 。

修改SQL:

CREATE TABLE t1 (name varchar(16383) NULL) CHARSET=utf8mb4;

  

示例2:

当创建 字符集类型为 utf8mb4字段为not NULL 值只有 1 个 varchar 字段 的表时:

SQL:

CREATE TABLE t2 (name varchar(65535) NOT NULL) CHARSET=utf8mb4;

错误: 

[Err] 1074 - Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead

解析:

VARCHAR 字段类型最多能存储的数据长度 = (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))

VARCHAR 字段类型最多能存储的数据长度 = (65535 - 2 ) / 4 = 16383.25 ,约为 16383 。

修改SQL:

CREATE TABLE t2 (name varchar(16383) NOT NULL) CHARSET=utf8mb4;

  

示例3:

当创建 字符集类型为 utf8mb4字段不可以为 NULL 值只有 1 个 varchar 字段加上 1 个 int 字段的表时,情况又不一样了。

SQL:

CREATE TABLE t3 (name varchar(16383) NULL, age int) CHARSET=utf8mb4;

错误:

[Err] 1118 - 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 

解析:

VARCHAR 字段类型最多能存储的数据长度
= 一行记录最大的数据大小(字节) / 字符集表示一个字符时的最大大小(字节)
= (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节) - NULL 值(1 字节)- int 类型的大小( 4 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))

即:VARCHAR 字段类型最多能存储的数据长度 = ( 65535 - 2 - 1 -4 ) / 4 = 16382 。

示例4:

如果我们更改编码类型为utf8 和 gbk看看报错信息

GBK:

CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=GBK;
#[Err] 1074 - Column length too big for column 'name' (max = 32767); use BLOB or TEXT instead

  字段长度 = (65535 - 2 - 1) / 2 =  32766

UTF8:

CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=utf8;

#[Err] 1074 - Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead

  字段长度 = (65535 - 2 - 1) / 3 =  21844

上面虽然提示了最大长度分别为32767和21845但是真创建时候会报错的

[SQL]CREATE TABLE t3 (name varchar(32767) NULL) CHARSET=GBK;
[Err] 1118 - 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            

修改SQL:

[SQL]CREATE TABLE t3 (name varchar(32766) NULL) CHARSET=GBK;
受影响的行: 0
时间: 0.006s

参考网站:跳转

原文地址:https://www.cnblogs.com/ryuma/p/15181704.html