专栏首页开发经验记录一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

看完这篇文章,你能搞清楚以下问题:

1、varchar(100)和varchar(10)的区别在哪里?

2、varchar能存多少汉字、数字?

3、varchar的最大长度是多少呢?

4、字符、字节、位,之间的关系?

5、mysql字段类型存储需要多少字节?

接下来请仔细看,整理不易啊。

1、varchar(100)和varchar(10)的区别在哪里?

一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【不准确的想法:varchar在实际存储的时候会多一个byte用来存放长度】。 但是深入一下,设计数据库的时候,二者一样吗? 答案是否定的【至少varchar类型需要在数据之前利用一个或者两个字节来存储数据的长度】并且二者在内存中的操作方式也是不同的,下面的例子中有体现(例子链接:看下面的例子。 ) 如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?

结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。解释可以参见这里。如果不想看解释,我这里大概说下:假设VARCHAR(100)与VARCHAR(200)类型,实际存90个字符,它不会对存储端产生影响(就是实际占用硬盘是一样的)。但是,它确实会对查询产生影响,因为当MySql创建临时表(SORT,ORDER等)时,VARCHAR会转换为CHAR,转换后的CHAR的长度就是varchar的长度,在内存中的空间就变大了,在排序、统计时候需要扫描的就越多,时间就越久。

所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。 ----------------------------------char------------------------------------------ 1、从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。 2、考虑其长度的是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常使用采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。 另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。

---------------------------------总结---------------------------------------------

二者在磁盘上存储占的空间是一样的。区别有二。第一、一个变长一个固定长度。第二、在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的。

2、varchar能存多少汉字、数字?

具体还是要看版本的,一个字符占用3个字节   ,一个汉字(包括数字)占用3个字节=一个字符

4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)

5.0版本以上,varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。

UTF8编码中一个汉字(包括数字)占用3个字节

GBK编码中一个汉字(包括数字)占用2个字节

3、varchar的最大长度是多少呢?

mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533,其中需要1到2个字节来存储数据长度(如果列声明的长度超过255,则使用两个字节来存储长度,否则1个)字节,当不允许非空字段的时候(因为要用一个字节来存储不可为空的标识),当允许非空字段的时候只能到65532(省下了存储非空的那个字节)。

行中可以用的字节数如下计算:(参考文档:https://www.jianshu.com/p/ee1e4b14c5e7 )

字段非空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) - 1 (null byte)=65531 字节可以用

减1的原因是实际行存储从第二个字节开始';

字段可以空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) =65532 字节可以用

根据这个最大字节数,以及编码方式,可以计算能存储的汉字数。

4、字符、字节、位,之间的关系?

1、位: 数据存储的最小单位。每个二进制数字0或者1就是1个位; 2、字节: 8个位构成一个字节;

即:1 byte (字节)= 8 bit(位);

1 KB = 1024 B(字节); 1 MB = 1024 KB;   (2^10 B) 1 GB = 1024 MB;  (2^20 B) 1 TB = 1024 GB;   (2^30 B)

3、字符:

a、A、中、+、*、の......均表示一个字符; 一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节;数字属于汉字,和汉字占用一样字节。 一般 gbk 编码下,一个汉字  字符  占用 2 个 字节;

5、mysql字段类型存储需要多少字节?

数字类型

列类型

需要的存储量

TINYINT

1 字节

SMALLINT

2 个字节

MEDIUMINT

3 个字节

INT

4 个字节

INTEGER

4 个字节

BIGINT

8 个字节

FLOAT(X)

4 如果 X < = 24 或 8 如果 25 < = X < = 53

FLOAT

4 个字节

DOUBLE

8 个字节

DOUBLE PRECISION

8 个字节

REAL

8 个字节

DECIMAL(M,D)

M字节(D+2 , 如果M < D)

NUMERIC(M,D)

M字节(D+2 , 如果M < D)

 日期和时间类型

列类型

需要的存储量

DATE

3 个字节

DATETIME

8 个字节

TIMESTAMP

4 个字节

TIME

3 个字节

YEAR

1 字节

 串类型

列类型

需要的存储量

CHAR(M)

M字节,1 <= M <= 255

VARCHAR(M)

L+1 字节, 在此L <= M和1 <= M <= 255

TINYBLOB, TINYTEXT

L+1 字节, 在此L< 2 ^ 8

BLOB, TEXT

L+2 字节, 在此L< 2 ^ 16

MEDIUMBLOB, MEDIUMTEXT

L+3 字节, 在此L< 2 ^ 24

LONGBLOB, LONGTEXT

L+4 字节, 在此L< 2 ^ 32

ENUM('value1','value2',...)

1 或 2 个字节, 取决于枚举值的数目(最大值65535)

SET('value1','value2',...)

1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)

text与blob的区别在于:text不能存储图片。blob是二进制流,text是非二进制。

mysql 的二进制数据类型 BINARY, VARBINARY, BLOB 都没有字符集的概念。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL中length()、char_length()的区别和用法

    (4)通过length()<>char_length()可以用来检验是否含有中文字符

    陈哈哈
  • MySQL 中 blob 和 text 数据类型详解

    前面文章我们介绍过一些常用数据类型的用法,比如 int、char、varchar 等。一直没详细介绍过 blob 及 text 类型,虽然这两类数据类型不太常用...

    MySQL技术
  • CHAR与VARCHAR面面观

    前面写过一篇介绍int类型的文章,一直想写一篇介绍字符串字段类型的文章,一直拖着也没思路要怎么下手。最近多关注了下这方面的文章,决定还是把拖了好久的文章了结了吧...

    MySQL技术
  • 制作mysql大数据表并验证覆盖索引的查询效率

    昨天跟同事聊起数据表性能的问题,能不能仅用覆盖索引实现数据的汇总统计。找了一个开发环境已有的数据表进行测试,通过explain命令,能看到mysql通过覆盖索引...

    程序猿讲故事
  • Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day14】—— 数据库3

      本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架...

    陈哈哈
  • MySQL创建数据表和MySQL数据类型

    实例解析: * 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。 *...

    周小董
  • Java进阶笔记——MySql中的varchar类型

    MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQ...

    慕容千语
  • 关于char/varchar(n)中n的探究:字符数or字节数

    很多时候我们不确定某个字段的长度,会使用varchar类型,比如某个字段定义为varchar(100),那这100的长度能存多少个中文?

    Tayloryu
  • 为什么不建议在MySQL中使用 utf8 ?

    MySQL 字符编码集中有两套 UTF-8 编码实现:utf8 和 utf8mb4。

    Guide哥
  • 入门MySQL——基础语句篇

    前面几篇文章,我们介绍了MySQL的基础概念及逻辑架构。相信你现在应该有了自己的一套MySQL环境,接下来我们就可以开始练习MySQL了。本文将从MySQL最基...

    MySQL技术
  • MySQL之char、varchar类型简析

    我们都知道,MySQL中关于字符,有char和varchar两种常用的类型,可能在平时的使用过程中,大家不会去关心这两种类型的区别,只是会用就可以了,或者说看...

    AsiaYe
  • DBbrain诊断日 | 这个匪夷所思的数据库故障,你会处理吗?

    为更好的帮助DBA运维数据库,腾讯云将于每月12日在社群直播开展DBbrain诊断日,腾讯云高级产品经理迪B哥直播解析经典数据库运维难题,结合腾讯云数据库智能...

    腾讯云数据库 TencentDB
  • varchar有最大长度限制吗

    先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。

    谭小谭
  • 第01期:MySQL 数据类型的艺术

    对于关系型数据库来说,表的设计 以及 SQL 的写法 尤为重要,占据性能的 90% 都不为过,所以这次专门针对这两大类知识领域,为您抽丝剥茧详细分析。

    爱可生开源社区
  • 7天快速掌握MySQL-DAY3

    这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PR...

    披头
  • 掌握了这30道MySQL基础面试题,我成了面霸

    一个典型的互联网产品架构包含接入层、逻辑处理层以及存储层,其中存储层承载着数据落地和持久化的任务,同时给逻辑处理层提供数据查询功能支持。说到存储层就要说到数据库...

    程序IT圈
  • 大数据【企业级360°全方位用户画像】业务数据调研及ETL

    之前关于用户画像项目部分的讲解大多停留在理论层面,本篇我们正式开始对该项目中所使用到的业务数据进行调研和ETL处理。

    大数据梦想家
  • Mysql如何查字段的长度,Mysql中length()、char_length()的区别

    1、今天发生了一件有意思的事情,传输的数据大于标准定的字段长度了,我把字段长度调大了,把数据传输过来了。谁知道,人家的数据不符合标准,要删除了重新搞,那么你如何...

    别先生
  • mysql学习笔记

    InnoDB引擎与MyISAM引擎 mysql是关系型数据库。其中的存储引擎可以show engines来查看。我的版本是5.6.26的,查看版本用selec...

    wangxl

扫码关注云+社区

领取腾讯云代金券