`

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

    Mysql中varchar长度设置方法

    mysql varchar(50) 不管中文 还是英文 都是存50个的 MySQL5的文档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用...

    MySQL数据库安装常见报错解决方案汇总.docx

    MySQL数据库安装常见报错解决方案汇总 一、常见问题 1:二次安装时配置文件安装不成功 问题描述:在安装MySQL时,配置文件安装不成功,出现爆红的选项。 解决方案:发生该报错的原因一般是第一安装的MySQL未卸载...

    JMeter对mysql数据库进行压力测试

    JMeter 对 MySQL 数据库进行压力测试 JMeter 是一个开源的性能测试工具,常用于对 Web 应用程序和数据库进行压力测试。在本文中,我们将学习如何使用 JMeter 对 MySQL 数据库进行压力测试。 创建数据库 首先,...

    MYSQL世界各洲包含国家英文、中文、简称、层级关系表-----------19

    MYSQL世界各洲包含国家英文、中文、简称、层级关系表,`bby_country` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `parent_id` smallint(6) NOT NULL DEFAULT '0' ...

    MySQL数据库进行中文全文检索的模拟实现方法.pdf

    然而,在输入关键字后进行查询找不到任何结果,该表对中文的全文检索是失效的,原因是MySQL对中文的支持不够,在进行中文分词的时候,由于汉字占用2个字节,用对英文分词的方法进行分词便会失败。 为了解决这个问题...

    MYSQL数据库中的现有表增加新字段(列)

    代码如下:ALTER TABLE `数据库名`.`表名` ADD COLUMN `PROCID` VARCHAR(6) DEFAULT ” AFTER `PPIDChanged`; –在MYSQL中,如果是表名,数据库名,列名,在你增加,修改,更新的时候都需要使用ESC键盘下的重音符号,...

    MySQL数据类型varchar详解

    2、varchar(N)到底能存多长的数据在mysql reference manual上,varchar最多能存储65535个字节的数据。varchar 的最大长度受限于最大行长度(max row size,65535bytes)。65535并不是一个很精确的上限,可以继续缩小...

    从mysql数据库迁移至sqlserver数据库

    从mysql数据库迁移至sqlserver数据库,支持2005,2008版本。 text类型建议先转换为varchar(10000)类型,否则迁移后中文会出现乱码。迁移后会自动转换为ntext类型。

    mysql varchar类型求和实例操作

    1、打开 数据库连接客户端Navicat Premium ,创建一个新的表结构,这里age这列 故意 设置为 varchar。 2、创建表成功之后,为刚刚的表创建一些测试的数据,这里如下图: 3、在数据量少的时候可以使用sum()函数直接...

    MYSQL世界各洲包含国家英文、中文、简称、层级关系表

    MYSQL世界各洲包含国家英文、中文、简称、层级关系表,`bby_country` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `parent_id` smallint(6) NOT NULL DEFAULT '...

    新华字典mysql数据库.sql

    20800个字。包含字段 id 汉字 无声声调拼音 五笔 偏旁部首 笔画数 有声调拼音 基本解释 详细解释 如下: CREATE TABLE `xhzd_surnfu` ( `id` float NOT NULL, `zi` varchar(255), `py` varchar(255), `wubi` varchar...

    MySQL-数据库-索引详解

    该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。只有查询条件使用这些字段中第一个字段时,索引才会被使用。 #### 空间索引 使用 spatial 参数可以设置索引为空间索引,空间索引只创建在空间数据...

    web_w3c日志导入mysql数据库

    所以写了一个导入数据库的工具,只支持w3c格式的日志 日志编码必须是gbk如果是utf-8的 里面的中文会出错 所有字段写入数据库的时候都是 varchar(255)没有单独处理时间等等 字段名自动命名 命名规则为 W3c+日志抬头...

    Mysql varchar大小长度问题介绍

    4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大...

    MySQL中文参考手册.chm

    9.1.1 用于数据和排序的字符集 9.1.2 增加一个新的字符集 9.1.3 多字节字符支持 9.2 更新日志 9.3 MySQL数据库表可以有多大? 9.4 MySQL数据库表类型 10 从 MySQL 得到最大的...

    【MySQL面试题干货集合】20个经典常用面试题-需要找工作的一定要看 共11页.pdf

    6 MySQL数据库cpu飙升到500%的话怎么处理? 5 7 sql优化 6 7.1 explain出来的各种item的意义; 6 7.2 profile的意义以及使用场景; 6 8 备份计划,MySQLdump以及xtranbackup的实现原理 6 8.1 备份计划; 6 8.2 备份...

    数据库 MySQL中文乱码解决办法总结

    但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。 1、中文乱码 1.1、中文乱码 create table user(name varchar(11)); # 创建user表 insert...

    MySQL中文参考手册

    + 3.4.4 运营一个使用MySQL的Web服务器 o 3.5 MySQL的许可证和技术支持费用 + 3.5.1 付款信息 + 3.5.2 联系信息 o 3.6 商业性支持的类型 + 3.6.1 基本的电子邮件支持 + 3.6.2 扩展的电子邮件支持 + 3.6.3 ...

    图书管理系统数据库设计mysql实现-().docx

    图书管理系统数据库设计mysql实现-() 图书管理系统数据库设计mysql实现-()全文共25页,当前为第1页。图书管理系统数据库设计mysql实现-()全文共25页,当前为第1页。图书管理系统数据库设计 图书管理系统数据库设计...

Global site tag (gtag.js) - Google Analytics