`

MySQL 数据库 varchar 到底可以存多少个汉字?多少个英文?

阅读更多

一.关于UTF-8

        UTF-8 Unicode Transformation Format-8bit。是用以解决国际上字符的一种多字节编码。它对英文使用8位(即一个字节) ,中文使用24位(三个字节)来编码。

        UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

        UTF-8编码的文字可以在各国支持UTF8字符集额的浏览器上显示。如果是UTF8编码,则在外国人的英文IE也能显示中文,他们无需下载IE的中文语言支持包。

 

二.关于GBK

        GBK 是国家标准GB2312基础上扩容后兼容GB2312的标准。

        GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。

        GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

 

三.关于utf8mb4

        MySql 5.5 之前,UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区,BMP是从哪到哪?戳这里,基本就是 0000 ~ FFFF 这一区。

        从MySQL 5.5 开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。

        utf8mb4 is a superset of utf8,tf8mb4兼容utf8,且比utf8能表示更多的字符。

        至于什么时候用,看你做的什么项目了,在做移动应用时,会遇到IOS用户在文本的区域输入emoji表情,如果不做一定处理,就会导致插入数据库异常。

 

四.汉字长度与编码有关

        MySql 5.0 以上的版本:

1.一个汉字占多少长度与编码有关:

        UTF-8:一个汉字 = 3个字节,英文是一个字节

        GBK: 一个汉字 = 2个字节,英文是一个字节

2.varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入n个字符,仅实际字节长度有所区别。

3.MySQL检查长度,可用SQL语言

SELECT LENGTH(fieldname) FROM tablename

 

五.实际测试

1.首先使用utf8创建str_test表

CREATE TABLE `str_test` (
        `name_chn` varchar(20) NOT NULL,
        `name_en`  varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8

        然后插入值

mysql> insert into  str_test values ('我爱Ruby', 'I Love Ruby!');
Query OK, 1 row affected (0.02 sec)

        打开irb

>> "我爱Ruby".size
=> 6
>> "I Love Ruby!".size
=> 12
>>

        从MySQL中查询出来的结果,对比

mysql> select * from str_test;
+------------+--------------+
| name_chn   | name_en      |
+------------+--------------+
| 我爱Ruby   | I Love Ruby! |
+------------+--------------+
1 row in set (0.02 sec)
mysql> select length(name_chn) from str_test;
+------------------+
| length(name_chn) |
+------------------+
|               10 |
+------------------+
1 row in set (0.01 sec)

        3[一个汉字三字节] * 2 + 1[一个英文一字节] * 4 = 10

mysql> select length(name_en) from str_test;
+-----------------+
| length(name_en) |
+-----------------+
|              12 |
+-----------------+
1 row in set (0.00 sec)

        10[一个英文一字节] * 1 + 2[空格一字节] * whitespace = 12

2.使用 GBK 做测试

        创建表

CREATE TABLE `str_test` (
        `name_chn` varchar(20) NOT NULL,
        `name_en`  varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

        插入数据,并且测试

mysql> insert into  str_test values ('我爱Ruby', 'I Love Ruby!');
Query OK, 1 row affected (0.00 sec)

mysql> select * from str_test;
+------------+--------------+
| name_chn   | name_en      |
+------------+--------------+
| 我爱Ruby   | I Love Ruby! |
+------------+--------------+
1 row in set (0.01 sec)

        GBK 中文是两个字节,英文是一个字节。

mysql> select length(name_chn) from str_test;
+------------------+
| length(name_chn) |
+------------------+
|                8 |
+------------------+
1 row in set (0.00 sec)

        2[中文两个字节] * 2 + 4[英文一个字节] * 1 = 8

mysql> select length(name_en) from str_test;
+-----------------+
| length(name_en) |
+-----------------+
|              12 |
+-----------------+
1 row in set (0.00 sec)

        10[英文一个字节] * 1 + 2[空格一个字节] * whitespace = 12

 

六.关于varchar 最多能存多少值

        a.mysql的记录行长度是有限制的,不是无限长的,这个长度是64K,即65535个字节,对所有的表都是一样的。

        b.MySQL对于变长类型的字段会有1-2个字节来保存字符长度。

        c.当字符数小于等于255时,MySQL只用1个字节来记录,因为2的8次方减1只能存到255。

        d.当字符数多余255时,就得用2个字节来存长度了。

        e.在utf-8状态下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。

        f.在gbk状态下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1

1.使用 utf-8 创建

mysql>     CREATE TABLE `str_test` (
->         `id`  tinyint(1)  NOT NULL,
->         `name_chn` varchar(21845) NOT NULL
->     ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8
-> ;
ERROR 1118 (42000): 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

mysql>     CREATE TABLE `str_test` (
->         `id`  tinyint(1)  NOT NULL,
->         `name_chn` varchar(21844) NOT NULL
->     ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8
->
->
-> ;
Query OK, 0 rows affected (0.06 sec)

2.使用gbk创建

        当存储长度为 32768 失败。

mysql>     CREATE TABLE `str_test` (
->         `id`  tinyint(1)  NOT NULL,
->         `name_chn` varchar(32768) NOT NULL
->     ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
-> ;
ERROR 1074 (42000): Column length too big for column 'name_chn' (max = 32767); use BLOB or TEXT instead

        当存储长度为32767失败

mysql>     CREATE TABLE `str_test` (                                                                                                 ->         `id`  tinyint(1)  NOT NULL,
->         `name_chn` varchar(32767) NOT NULL
->     ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
-> ;
ERROR 1118 (42000): 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

        当存储长度为 32766 成功

mysql>     CREATE TABLE `str_test` (
->         `id`  tinyint(1)  NOT NULL,
->         `name_chn` varchar(32766) NOT NULL
->     ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
-> ;
Query OK, 0 rows affected (0.03 sec)

        smallint 用两个字节存储,所以

        2[smallint] + 32766 * 2[varchar存储长度] + 2[2个字节来存长度] = 65538 > 65535,所以失败。

mysql>     CREATE TABLE `str_test` (
->         `id`  smallint(1)  NOT NULL,
->         `name_chn` varchar(32766) NOT NULL
->     ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
-> ;
ERROR 1118 (42000): 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

 

七.数值类型所占的字节


        官方关于decimal 的描述如下:

        Values for DECIMAL (and NUMERIC) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes.

        Storage for the integer and fractional parts of each value are determined separately.

        Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes.

        The storage required for excess digits is given by the following table.

        翻译为中文:

        使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。

        每个值的整数和分数部分的存储分别确定。

        每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。

        下表给出了超出位数的存储需求:


        那decimal(10,2)占几个字节?

        a.首先 10 指的是整数与小数部分的总长度, 2指的是小数部分的长度。那么整数部分就只有 10 - 2 = 8 位。

        b.因为整数与小数的存储市各自独立确定的,所以他们各自所占用空间的综合就是所占的总空间了。

        c.对表可知,整数部分8位占了4个字节,小数部分2位占了1个字节,所以decimal(10,2)总共占了 4 + 1 = 5 个字节。

        d.decimal(6,2) 整数部分(6 - 2 = 4) 位占2字节,小数部分2位占1字节,总共占3字节。

 

八.总结

        varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

        UTF-8:一个汉字 = 3个字节,英文是一个字节

        GBK: 一个汉字 = 2个字节,英文是一个字节

        在utf-8状态下,汉字最多可以存 21844个字符串, 英文也为 21844个字符串。

        在gbk状态下,汉字最多可以存 32766个字符串,英文也为 32766个字符串。

 

文章来源:https://ruby-china.org/topics/24920

  • 大小: 4.7 KB
  • 大小: 5.6 KB
分享到:
评论

相关推荐

    Mysql中varchar长度设置方法

    然而,实际上MySQL的`VARCHAR`类型在存储时会额外使用1到2个字节来记录字符串的长度,这意味着即使使用UTF-8编码,`VARCHAR(50)`仍能存储50个英文字符或16个中文字符。 在MySQL 5.1及以上版本中,`VARCHAR`的最大...

    MySQL数据库varchar的限制规则说明

    MySQL数据库中varchar最大长度是多少?其实这不是一个固定的数字,varchar的长度是有限制规则的。本文我们就来介绍一下MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,接下来就让我们一...

    mysql数据库cmd命令大全

    MySQL 数据库 cmd 命令是 MySQL 数据库管理和操作的基础,掌握这些命令可以提高数据库管理和开发效率。本文档总结了 MySQL 数据库 cmd 命令的使用方法和实践经验,涵盖了连接数据库、授权、数据库操作、表操作、字段...

    MySQL数据库实验文件

    在这个“MySQL数据库实验文件”中,你将找到一系列以.csv格式存储的数据表,这些文件通常用于数据导入,方便进行数据库设计和分析实验。 CSV(Comma Separated Values)是一种通用的文件格式,它以逗号分隔每个字段...

    mysql数据库实验报告 数据表的操作

    本实验旨在深入理解MySQL数据库的基本操作,包括数据库的创建、查看、删除和使用,以及表结构的设计与管理。通过实际操作,我们将掌握如何创建和修改表结构,设置表约束,以及处理表数据的插入、删除和修改。此外,...

    MySQL数据库设计、优化.pptx

    MySQL数据库设计与优化是数据库管理中的重要环节,它关乎到系统的性能、稳定性和可扩展性。本讲座由叶金荣分享,主要涵盖了多个关键方面,包括规范、基础规范、命名规范、库表规范、字段规范、索引规范以及开发环境...

    MySQL数据库设计、优化

    ### MySQL数据库设计与优化知识点详解 #### 一、MySQL数据库设计概述 MySQL作为一种广泛使用的开源关系型数据库管理系统,其设计的好坏直接影响着系统的性能、稳定性和可维护性。因此,合理的数据库设计对于确保...

    TXT文件数据导入到mysql数据库

    接下来,我们需要创建一个与TXT文件结构匹配的MySQL数据库表。假设我们的TXT文件有三列:ID(整数)、Name(字符串)和Date(日期),那么可以创建如下表结构: ```sql CREATE TABLE `import_data` ( `ID` INT NOT...

    MySQL数据库笔记.doc

    * 一个 MySQL 实例可以包含多个数据库,每个数据库可以包含多个表。 * 可以使用 CREATE DATABASE 语句创建数据库,使用 CREATE TABLE 语句创建表。 MySQL 中的数据操作 * 可以使用 INSERT 语句创建数据,使用 ...

    MySQL数据库学习笔记.pdf

    MySQL数据库是世界上最受欢迎的开源关系型数据库管理系统之一,它的学习对于任何希望从事IT行业的人员来说都是必不可少的。本文将深入探讨MySQL的一些核心概念和技术。 首先,我们要了解SQL(Structured Query ...

    flask 框架操作MySQL数据库简单示例

    在Python web开发中,Flask是一个轻量级的Web服务程序框架,而MySQL是一种广泛使用的开源关系型数据库管理...通过以上步骤,开发者可以有效地在Flask应用中管理和操作MySQL数据库,实现web应用的数据存储和检索功能。

    mysql数据库精深.docx

    MySQL数据库是世界上最受欢迎的关系型数据库管理系统之一,广泛应用于各种规模的应用程序中,从小型网站到大型企业级系统。本文将深入探讨MySQL的基础知识,包括数据类型、约束条件、表的操作以及查询语句。 1. ...

    在Qt中连接MySQL数据库.txt

    ### 在Qt中连接MySQL数据库的关键知识点 #### 一、引言 在开发基于Qt的应用程序时,连接到MySQL数据库是一项常见的需求。通过这种方式,应用程序能够读取或写入数据,从而实现更强大的功能。本文将详细介绍如何在Qt...

    将图片存入mysql数据库中

    在本场景中,我们将探讨如何将图片存入MySQL数据库,特别是针对用户头像的存储和管理。 首先,我们需要理解MySQL数据库对二进制数据的支持。在MySQL中,可以使用BLOB(Binary Large Object)类型的字段来存储图片...

    MySQL数据库中文参考手册(CHM).rar

    MySQL数据库中文参考手册是一部详尽且全面的指南,旨在帮助用户深入理解和操作MySQL数据库系统。MySQL是一种广泛应用的关系型数据库管理系统(RDBMS),以其开源、免费、高效和易用性而受到全球开发者的青睐。CHM...

    Mysql数据库规范.docx

    MySQL数据库规范是数据库设计和管理中的重要指导原则,旨在提高数据库的性能、稳定性和可维护性。MySQL作为一款广泛应用的关系型数据库管理系统,其历史可以追溯到1979年,由Monty Widenius编写,经过多次迭代和收购...

    某行MySQL数据库开发规范

    ### 某行MySQL数据库开发规范 #### 一、规范的范围和目的 **1.1 规范的范围** 本规范主要涵盖MySQL数据库的SQL语句开发与性能优化、数据库用户及权限管理、数据库日常维护等内容。适用于招联消费金融有限公司内部...

Global site tag (gtag.js) - Google Analytics