iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql中varchar类型一些需要注意的地方
  • 887
分享到

Mysql中varchar类型一些需要注意的地方

Mysqlvarchar类型Mysqlvarchar类型注意的地方 2022-05-27 11:05:13 887人浏览 泡泡鱼
摘要

varchar的存储规则 0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)。 5.0版本以上,varchar(20),指的是20字符,无论

varchar的存储规则

0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)。
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节。
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度。
官方是这么说的:

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before Mysql 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
In contrast to CHAR, VARCHAR values are stored as a one-byte or two-byte length prefix plus data. The length prefix indicates the number of bytes in the value.
A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.

varchar和char 的区别

区别一,定长和变长

char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。
varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。但是因为他需要有一个prefix来表示他具体bytes数是多少(因为varchar是变长的,没有这个长度值他不知道如何读取数据)。

区别之二,存储的容量不同

对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节

varchar的编码长度限制

字符类型若为 gbk,则个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,则每个字符最多占3个字节,最大长度不能超过21845。 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 mysql要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示 ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
这就是说,比如创建一个表,表结构中有两个varhcar类型字段,那么这两个字段的总长度不能超过65535。
官方说明如下:

Every table has a maximum row size of 65,535 bytes.
This maximum applies to all storage engines, but a given engine might have additional constraints that result in a lower effective maximum row size.

varchar的控制位

Mysql 中的Varchar字符类型还保留了1个字节来留其它控制信息。

示例

示例一:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少?

如:create table tb_name1(a varchar(N)) default charset=utf8,则N最大值=(65535-1-2)/3=21844。
减1的原因是实际行存储从第二个字节开始。
减2的原因是varchar头部的2个字节表示长度。
除3的原因是字符编码是utf8。
sql测试


create table tb_name1(a varchar(21844)) default charset=utf8;
Query OK, 0 rows affected (0.38 sec)

drop table tb_name1;
Query OK, 0 rows affected (0.00 sec)

create table tb_name1(a varchar(21845)) default charset=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns 

示例二:若一张表中有一个字段VARCHAR(N)类型,并且有其它的字段类型,utf8编码,则N的最大值为多少?

如:create table tb_name2(a int, b char(20), c varchar(N)) default charset=utf8;
则:N最大值=(65535-1-2-4-203)/3=21822
减1的原因是实际行存储从第二个字节开始。
减2的原因是varchar头部的2个字节表示长度。
减4的原因是a字段的int类型占4个字节。
减203的原因是char(20)占用60个字节,编码是utf8。

sql测试:


create table tb_name2(a int, b char(20), c varchar(21822)) default charset=utf8;
Query OK, 0 rows affected (0.28 sec)

drop table tb_name2;
Query OK, 0 rows affected (0.20 sec)

create table tb_name2(a int, b char(20), c varchar(21823)) default charset=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

示例三:若一张表中有多字段VARCHAR(N)类型,并且有其它的字段类型,gbk编码,则N的最大值为多少?

如:create table tb_name3(a int, b char(20), c varchar(50), d varchar(N)) default charset=gbk;
则:N最大值=(65535-1-1-2-4-202-502)/2=32693
第一个减1的原因是实际行存储从第二个字节开始。
第二个减1表示第二个varchar(50)头部一个1个字节表示长度(小于255)。
减2的原因是varchar头部的2个字节表示长度。
减202的原因是char(20)占用40个字节,编码是gbk。
减502的原因是varchar(50)占用100个字节,编码是gbk。

SQL测试:


create table tb_name3(a int, b char(20), c varchar(50), d varchar(32694)) default charset=gbk;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

create table tb_name3(a int, b char(20), c varchar(50), d varchar(32693)) default charset=gbk;
Query OK, 0 rows affected (0.18 sec)

以上就是Mysql中varchar类型一些需要注意的地方的详细内容,更多关于Mysql varchar类型的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Mysql中varchar类型一些需要注意的地方

本文链接: https://www.lsjlt.com/news/10101.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis中redis-cluster需要注意哪些地方
    本篇内容主要讲解“Redis中redis-cluster需要注意哪些地方”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis中redis-cluster需要...
    99+
    2024-04-02
  • MySQL数值类型在binlog中需要注意的细节有哪些
    MySQL数值类型在binlog中需要注意的细节有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。     ...
    99+
    2024-04-02
  • 异步编程中Java数据类型的选择有哪些需要注意的地方?
    异步编程是现代软件开发中重要的一部分。在Java中,异步编程可以使用多种方式来实现,包括线程、Future和CompletableFuture等。然而,在使用这些技术时,我们需要注意Java数据类型的选择。在本文中,我们将探讨异步编程中Ja...
    99+
    2023-09-16
    数据类型 linux 异步编程
  • java继承中需要注意的地方有哪些
    这篇文章给大家分享的是有关java继承中需要注意的地方有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、注意点(1)Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。(2)在Java中,所...
    99+
    2023-06-15
  • js中使用原型对象prototype需要注意的地方有哪些
    这篇文章主要为大家展示了“js中使用原型对象prototype需要注意的地方有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中使用原型对象prototy...
    99+
    2024-04-02
  • Android LiveData使用需要注意的地方
    目录1.回调通知2.数据倒灌3.事件包装关于LiveData是什么以及基本使用方式,请参考官方文档:developer.android.com/topic/libra… 简单来说,L...
    99+
    2024-04-02
  • 使用redis集群需要注意的地方有哪些
    小编给大家分享一下使用redis集群需要注意的地方有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis集群相对单机在功...
    99+
    2024-04-02
  • Bash 脚本编写有哪些需要注意的地方?
    Bash 脚本是一种非常方便的编程语言,可以用于自动化任务、管理系统、实现批处理等多种应用场景。但是,由于 Bash 脚本的语法比较灵活,很容易出现错误,因此编写 Bash 脚本需要注意一些细节,以确保脚本的正确性和可靠性。本文将介绍 B...
    99+
    2023-07-23
    bash leetcode 并发
  • oracle首次安装需要注意的地方有哪些
    这篇文章给大家分享的是有关oracle首次安装需要注意的地方有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 首次安装时,需要确认的以下列表: 1、创建控制文件时,需要确...
    99+
    2024-04-02
  • Java中的HTTP二维码API:有哪些需要注意的地方?
    在当今数字化时代,二维码已经成为了人们常用的信息传递方式之一。二维码可以在不同的场景中使用,比如商业活动、广告宣传、门票验证等等。Java作为一门广泛使用的编程语言,也提供了HTTP二维码API来支持二维码的生成和解码。在使用Java中的...
    99+
    2023-08-23
    http 二维码 api
  • IE8 Beta 1需要注意的地方地方是什么
    IE8 Beta 1需要注意的地方地方是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前两天特意装了一下IETester,用以方便测试,装好后使用发现IE8有两个地方需要大...
    99+
    2023-06-08
  • 在 Go 中使用 NumPy 索引:有哪些需要注意的地方?
    NumPy 是一个广泛使用的 Python 科学计算库,它提供了高效的数组操作和数学函数。然而,由于 Python 的解释执行特性,NumPy 在处理大型数据集时可能会变得缓慢。为了解决这个问题,一些开发者开始使用 Go 语言来实现高性能...
    99+
    2023-06-27
    文件 numpy 索引
  • Java关键字在开发中有哪些需要注意的地方?
    Java作为一种面向对象的编程语言,其关键字(keywords)在开发过程中扮演着非常重要的角色。这些关键字有时候会对程序的性能、可读性、可维护性等产生影响。在本篇文章中,我们将探讨Java关键字在开发中需要注意的地方,并附带演示代码。 一...
    99+
    2023-09-12
    关键字 开发技术 文件
  • PostgreSQL中APP在涉及locks时需要注意的地方有哪些
    这篇文章主要讲解了“PostgreSQL中APP在涉及locks时需要注意的地方有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL中A...
    99+
    2024-04-02
  • 基于Java8并行流有哪些需要注意的地方
    这篇文章主要介绍了基于Java8并行流有哪些需要注意的地方,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java8并行流(parallelStream)注意点在最初使用并行流...
    99+
    2023-06-20
  • C语言转换类型时需要注意哪些事项
    在C语言中,类型转换时需要注意以下事项: 数据可能丢失:当将一个大范围的数据类型转换为一个小范围的数据类型时,可能会导致数据丢失...
    99+
    2024-03-15
    C语言
  • Jquery Ajax的Get方式时需要注意URL地方
    提示:我们要时刻注意浏览器缓存, 当使用GET方式时要添加时间戳参数 (net Date()).getTime() 来保证每次发送的URL不同, 可以避免浏览器缓存. 提示: 当在u...
    99+
    2022-11-21
    Ajax Get方式
  • IDE 文件中的 ASP 重定向:有哪些需要注意的地方?
    在 ASP 的开发中,我们经常需要使用重定向功能来实现页面的跳转。ASP 重定向是一种非常常见的页面跳转方式,它可以帮助用户快速地跳转到目标页面,同时也能够帮助开发人员更好地管理页面之间的关系。在本文中,我们将介绍 ASP 重定向的相关知...
    99+
    2023-10-29
    重定向 ide 文件
  • Java1.5的Enum类型使用时需要注意什么
    本篇内容主要讲解“Java1.5的Enum类型使用时需要注意什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java1.5的Enum类型使用时需要注意什么”吧!注意点:1。所有创建的枚举类型都...
    99+
    2023-06-03
  • 浅谈使用setBounds()方法需要注意的地方
    第一点,使用这个方法,component的x,y坐标是相对于它的父容器的。如果不注意,x、y的值,比父容器的宽度和高度还大的话,就容易造成加进去组件但是显示不出来的问题。我就是遇到这么一个问题,现在才想明白。第二点,这个方法只有在父容器的布...
    99+
    2023-05-31
    setbounds 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作