精华内容
下载资源
问答
  • 汉字长度与编码有关 MySql 5.0 以上版本: ...2、varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。 3、不知道好多博客这么写。 但跟自测结果不一样 自测utf-8 1...

    汉字长度与编码有关

    MySql 5.0 以上的版本:

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

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

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

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

    3、不知道好多博客这么写的。 但跟自测结果不一样    自测utf-8

     

    1 注意

    utf8_general_ci 不区分大小写

    utf8_general_cs 区分大小写

    2 注意

    MySQL 5.6

    自测  utf8  utf8_general_ci   varchar(10)  ,char(10)

    都可以插入 10个汉字 , 或者10英文字   

    转载于:https://www.cnblogs.com/chxl800/p/10874437.html

    展开全文
  • mysql varchar(128)可以存多少汉字

    千次阅读 2018-06-05 16:33:00
    首先要确定mysql版本4.0版本以下,varchar(50),指是50字节,如果存放UTF8汉字时,只能16个(每个汉字3字节) 5.0版本以上,varchar(50),指是50字符,无论存放是数字、字母还是UTF8汉字(每个汉字3字节),...
    首先要确定mysql版本
    4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节)
    5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个

    其实最好的办法是在自己数据库中建个表试试可以放多少汉字,现在mysql都5.0已上了,varchar(50)是可以存50个汉字的

    附注:汉字在不同编码的字节数

     

    
    

    转载于:https://www.cnblogs.com/withoutaword/p/9140479.html

    展开全文
  • MySQL 数据库 varchar 到底可以存多少汉字,多少个英文呢?我们来搞搞清楚 转载,原文地址:https://www.cnblogs.com/printN/p/7252490.html 一、关于UTF-8 UTF-8 Unicode Transformation Format-8bit。是用以...

    MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚

    转载,原文地址:https://www.cnblogs.com/printN/p/7252490.html

    一、关于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 最多能存多少值

    mysql的记录行长度是有限制的,不是无限长的,这个长度是64K,即65535个字节,对所有的表都是一样的。
    
    MySQL对于变长类型的字段会有1-2个字节来保存字符长度。
    
    当字符数小于等于255时,MySQL只用1个字节来记录,因为2的8次方减1只能存到255。
    
    当字符数多余255时,就得用2个字节来存长度了。
    
    在utf-8状态下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。
    
    在gbk状态下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 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)
    

    使用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个字节来存长度] > 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
    
    七、数值类型所占的字节

    类型 所占字节
    int 4 字节
    smallint 2 字节
    tinyint 1 字节
    decimal 变长

    官方关于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个字节的一部分。
    
    下表给出了超出位数的存储需求:
    

    Leftover Digits Number Of Bytes
    0 0
    1 1
    2 1
    3 2
    4 2
    5 3
    6 3
    7 4
    8 4

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

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

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

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

    4、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个字符串。

    展开全文
  • MySQL 数据库 varchar 到底可以存多少汉字,多少个英文呢?我们来搞搞清楚 一、关于UTF-8 UTF-8Unicode Transformation Format-8bit。是用以解决国际上字符一种多字节编码。 它对英文使用8位(即一个字节) ,...

    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 表。

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    CREATE TABLE `str_test` (
            `name_chn` varchar(20) NOT NULL,
            `name_en`  varchar(20) NOT NULL
        ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8</code>

    然后插入值

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    mysql> insert into  str_test values ('我爱Ruby', 'I Love Ruby!');
        Query OK, 1 row affected (0.02 sec)</code>

    打开irb

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    >> "我爱Ruby".size
        => 6
        >> "I Love Ruby!".size
        => 12
        >></code>

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

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    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)</code>

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

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    mysql> select length(name_en) from str_test;
        +-----------------+
        | length(name_en) |
        +-----------------+
        |              12 |
        +-----------------+
        1 row in set (0.00 sec)</code>

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

    2、使用 GBK 做测试

    创建表

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">        CREATE TABLE `str_test` (
            `name_chn` varchar(20) NOT NULL,
            `name_en`  varchar(20) NOT NULL
        ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk</code>

    插入数据,并且测试

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    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)</code>

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

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    mysql> select length(name_chn) from str_test;
        +------------------+
        | length(name_chn) |
        +------------------+
        |                8 |
        +------------------+
        1 row in set (0.00 sec)</code>

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

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    mysql> select length(name_en) from str_test;
        +-----------------+
        | length(name_en) |
        +-----------------+
        |              12 |
        +-----------------+
        1 row in set (0.00 sec)</code>

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

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

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

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

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

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

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

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

    使用 utf-8 创建

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">        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)</code>

    使用gbk创建

    当存储长度为 32768 失败~

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">        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</code>

    当存储长度为 32767 失败~

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    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</code>

    当存储长度为 32766 成功~

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">    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)</code>

    smallint 用两个字节存储,所以

    2[smallint] + 32766 * 2[varchar存储长度] + 2[2个字节来存长度] > 65535

    所以失败~

    <code style="font-family:Monaco, Menlo, 'Courier New', monospace;line-height:18px;display:block;border:none !important;" class="hljs">     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</code>

    #####七、数值类型所占的字节

    类型 所占字节
    int 4 字节
    smallint 2 字节
    tinyint 1 字节
    decimal 变长

    官方关于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个字节的一部分。

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

    Leftover Digits Number Of Bytes
    0 0
    1 1
    2 1
    3 2
    4 2
    5 3
    6 3
    7 4
    8 4

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

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

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

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

    4、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个字符串。

     

    问:

    在utf-8状态下,汉字最多可以存 21844个字符串, 英文也为 21844个字符串。 utf-8的情况下,英文不是只占一个字节码,按 (65535 - 2) / 3 = 21844 余 1这条计算中文的公式,英文的计算够公司不就是(65535 - 2) /1吗?怎麼还会是 21844呢?不懂,求博主解释

    答:

    个人认为是mysql会默认以最大的每个字符占用3字节来进行varchar里面数值的限制,也就是假设这个字段里面的值都是汉字。所以在进行字段定义时,只能写到21844.如果定义为你理解的65533,那我在里面存65533个汉字不就超出了嘛,而且如果不能存,也违背了varchar的定义了。实际上我自己试了一下,5.7的版本,21844是会提示报错的,提示使用blogs与text类型,应该是接近了它最大值之前就会有一个阈值来提示用户换类型使用了。

     

    以下为我peachesTao自己的实测

    我在数据库中(版本:5.7.26)验证了下,提示只能存21845个字符,

    当前改成21845时又提示我超出了行最大容量65535,最后存21844是成功的, 我理解可能整个行的大小在所有列大小的基础上额外加上一个字节

    展开全文
  • 一、关于 UTF-8 UTF-8Unicode Transformation Format-8bit。是用以解决国际上字符一种多字节...UTF-8编码文字可以在各国支持 UTF8 字符集额浏览器上显示。 如果是UTF8编码,则在外国人英文 IE 也能显示中.
  • 4.0版本以下,varchar(100),指是100字节,如果存放UTF8汉字时,只能33个(每个汉字3字节) 5.0版本以上,varchar(100),指是100字符,无论存放是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个...
  • 一.关于UTF-8  UTF-8 Unicode Transformation Format-8bit。是用以解决国际上字符一种多字节编码。它对英文使用8位(即一个字节) ,中文使用24位... UTF-8编码文字可以在各国支持UTF8字符集额浏览器上显示...
  • varchar255可以存多少汉字

    万次阅读 2016-05-25 16:24:29
    在字符集为UTF-8情况下: MySQL | ver < 4.1: VARCHAR以字节为单位存储,...= 4.1: VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。 另外,据我所知,MySQL对UTF-8...
  • varchar类型可以存储多少汉字多少个数字,是要具体看我们的mysql版本 如下: 4.0版本以下,比如 varchar(100),指是100字节,如果存放UTF8汉字时,只能33个(每个汉字3字节) 5.0版本以上,比如varchar(100)...
  • 一、关于UTF-8 UTF-8 Unicode Transformation Format-8bit。是用以解决国际上字符一种多字节编码。 ...它对英文使用8位(即一个字节) ...UTF-8编码文字可以在各国支持UTF8字符集额浏览器上显示。 如果是UTF
  • 是50字符,无论存放是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个其实最好办法是在自己数据库中建个表试试可以放多少汉字,现在mysql都5.0已上了,varchar(50)是可以存50个汉字 转载...
  • varchar(50),指是50字符,无论存放是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个其实最好办法是在自己数据库中建个表试试可以放多少汉字,现在mysql都5.0已上了,varchar(50)是可以存50个汉字
  • 首先要确定mysql版本4.0版本以下,varchar(50),指是50字节,如果存放UTF8汉字时,只能16个(每个汉字3字节) 5.0版本以上,varchar(50),指是50字符,无论存放是数字、字母还是UTF8汉字(每个汉字3字节),...
  • MySQLVARCHAR(n)最多能存多少汉字

    千次阅读 2018-08-01 17:50:12
    首先要确定自己使用的MySQL版本是多少 (1)MySQL 4.0 版本以下,VARCHAR(n) 中 n 指是改字段容量为 n 字节。如果存放的汉字为UTF8编码时(utf8编码每个汉字占3字节),则只能16个汉字。 (2)MySQL 5.0 版本...
  • mysql varchar(50)到底能存多少汉字

    万次阅读 多人点赞 2017-10-25 11:25:11
    mysql 4.0版本以下,varchar(50), 指是50字节,如果存放utf8汉字时,只能存放16个(每个汉字3字节) mysql 5.0版本以上,varchar(50), 指是50字符,无论存放...可以自己建个表试试varchar(50)可以多少汉字
  • 其实varchar类型可以存储多少汉字多少个数字,是要具体看我们的mysql版本。 如下: 4.0版本以下,比如 varchar(100),指是100字节,如果存放UTF8汉字时,只能33个(每个汉字3字节) 5....
  • 4.0版本以下,varchar(100),指是100字节,如果存放UTF8汉字时,只能33个(每个汉字3字节)  5.0版本以上,varchar(100),指是100字符,无论存放是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

mysql的varchar可以存多少汉字

mysql 订阅