前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL | VARCHAR(200)能存200个汉字吗?

MySQL | VARCHAR(200)能存200个汉字吗?

作者头像
烟雨平生
发布2024-04-17 16:37:15
2590
发布2024-04-17 16:37:15
举报
文章被收录于专栏:数字化之路数字化之路

概述

在数据库设计中,选择合适的数据类型对于确保数据的有效存储和查询效率至关重要。对于需要存储文本信息的场景,我们常会使用VARCHAR类型。 然而,对于不同语言的字符,VARCHAR所能存储的数量会有所不同。

本文将探讨MySQL中VARCHAR(200)是否能存储200个汉字,并解释其背后的原理。

先说结论:在MySQL 5.5及以上版本中,可以。

需求分析

目前互联网公司数据持久化中间件都选了MySQL。 在实际应用中,有时会遇到需要存储大量汉字的需求。例如,备注信息最多可以填写200个汉字,这时我们需要确定MySQL中的VARCHAR(200)是否能满足这一需求。

MySQL VARCHAR与汉字存储

在MySQL中,VARCHAR类型的字段用于存储可变长度的字符串,长度可以是0到65,535之间的值,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和使用的语言环境。 其定义的数字参数表示该字段可以存储的最大字符数。 然而,这个“字符数”并不是指的“汉字数”,也不是字节数。 譬如VARCHAR(6)代表最多可以存储6个字符。

实际上,一个汉字在计算机中的存储通常需要多个字节,而英文字符一般只需要一个字节。因此,能存储的汉字数量会受到所选字符集的影响

不同字符集不同编码每个字符占用的磁盘空间是不同的: ASCII使用一个字节(8 bits)表示一个字符,最多只能表示256个字符; GB2312使用2个字节表示一个中文字符; Big5使用2个字节表示一个中文字符; ISO8859-1【Latin-1】使用1个字节表示一个字符; Unicode字符集,使用不同的编码方案,一个字符占用的空间也不不同的: UTF-8编码使用1~4个字节表示一个符号,会根据不同的符号而变化字节长度; UTF-16编码使用用两个字节或四个字节表示一个字符; UTF-32编码使用用四个字节表示一个字符。 唐成,公众号:的数字化之路计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

对于英文字符,如果采用ASCII字符集【latin1】,每个字符占用1个字节。

因此,VARCHAR(200)可以存储200个英文字符。 对于汉字,如果使用utf8mb4字符集(这是非常常见的情况),

代码语言:javascript
复制
从MySQL 5.5开始,引入了utf8mb4字符集。utf8mb4 is a superset of utf8并且兼容utf8,
它支持最多4个字节的UTF-8编码,允许存储更多的字符,
包括一些特殊的Unicode字符,如表情符号、某些古文字等。

一个汉字通常占用3个字节。 在这种情况下,VARCHAR(200)大约可以存储66个汉字左右(200字节/3字节/汉字)。 这样的话,如果需求是存储200个汉字,并且数据库使用的是utf8mb4字符集,那么应该选择更大的VARCHAR定义,如VARCHAR(600)。

真的是这样吗?

不是的。 Show the code: 脱离版本讲可行性就是耍流氓。 先来看当前MySQL的版本:

Tips:200字符较长,一眼很难判断是否超过200,下面使用VARCHAR(6)来进行演示

代码语言:javascript
复制
CREATE TABLE
  `user` (
    `id` int NOT NULL AUTO_INCREMENT,
    `name` varchar(6) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time',
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modify time',
    PRIMARY KEY (`id`)
  ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试varchar存储汉字'
 INSERT INTO
  user(name)
VALUES
  ('壹贰参肆伍陆');
  INSERT INTO
  user(name)
VALUES
  ('壹贰参肆伍陆柒');

果然,VARCHAR(6)是可以存6个汉字的。 从字符编码角度看,在utf8mb4编码中,英文字符通常只需要一个字节,而中文字符可能需要三个字节。但是在MySQL中,VARCHAR类型的长度限制是按照字符数来计算的,而不是字节数。这意味着,无论存储的是英文还是中文,只要字符数不超过定义的长度,就可以存储。

从数据库版本角度看,在MySQL 5.0及以上版本中,VARCHAR类型的最大长度可以达到65535个字符,但由于需要额外1到2个字节来存储数据长度,实际可存储的最大字符数为65533个字符。因此,如果您的MySQL版本是5.0或以上,那么VARCHAR(6)可以存储的字符数实际上是6个,而不是2个中文汉字。

从字段定义的角度看,在user表的DML语句中,name字段被定义为VARCHAR(6),这意味着它可以存储最多6个字符。当您insert“壹贰参肆伍陆”时,它是6个字符,没有超过字段定义的长度限制,因此可以成功存储。

VARCHAR能存储65533个字符?

答案:在utf8mb4编码时,不能。 最多可以存16383个字符。

代码语言:javascript
复制
CREATE TABLE
  `msg` (
    `id` int NOT NULL AUTO_INCREMENT,
    `msg` varchar(65533) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '消息,测试varchar最大长度',
    PRIMARY KEY (`id`)
  ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试varchar存储汉字';
 
代码语言:javascript
复制
CREATE TABLE
  `msg` (
    `id` int NOT NULL AUTO_INCREMENT,
    `msg` varchar(16383) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '消息,测试varchar最大长度',
    PRIMARY KEY (`id`)
  ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试varchar存储汉字';

因为id这一列也占用了空间。 只保留msg列:

代码语言:javascript
复制
CREATE TABLE
  `msg` (
    `msg` varchar(16383) 
  ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

为什么是16383而不是65533?

因为utf8mb4可以存储多达4个字节的Unicode字符。 65533/4=16383。

这个最保守的数字,让VARCHAR类型有了更大的确定性和稳定性。

小结

在选择MySQL的VARCHAR类型时,不仅要考虑存储的字符数量,还要考虑所使用的字符集。由于不同字符集下字符所占用的字节数不同,相同的VARCHAR定义能够存储的汉字数量也会有所不同。 在设计数据库时,应充分考虑这些因素,以确保能够满足实际的存储需求。

REFERENCE

11.3.2 The CHAR and VARCHAR Types https://dev.mysql.com/doc/refman/5.7/en/char.html

8.4.7 Limits on Table Column Count and Row Size https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

一次故障解决过程梳理:mysql varchar text timestamp https://www.cnblogs.com/softidea/p/6681198.html

计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

http://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 需求分析
  • MySQL VARCHAR与汉字存储
  • VARCHAR能存储65533个字符?
  • 小结
  • REFERENCE
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档