精华内容
下载资源
问答
  • varchar255可以存多少汉字
    万次阅读
    2016-05-25 16:24:29
    在字符集为UTF-8的情况下:

    MySQL | ver < 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8 3字节编码长度),则VARCHAR(255)共可存放约85个汉字;
    MySQL | ver >= 4.1: VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。
    另外,据我所知,MySQL对UTF-8的支持也仅仅限于1~3字节编码长度(Unicode:0x0000~0xFFFF),可以满足大部分需求,但是生僻字就不行了。
    更多相关内容
  • 楼上三回复都正确但都不全面 ...这事情主要还是看 数据库字符集 ...如果是 latin1 的话 ... 计算字节长度 ... greatghoul 的答案是对的 ...如果是 utf-8 的话 ... 计算字符长度 ... joyeu 的答案是对的 ...至于 ...

    好吧这问题的最佳答案难选了 ... 我是来添乱的 ...

    楼上三个回复都正确但都不全面 ...这事情主要还是看 数据库字符集 ...

    如果是 latin1 的话 ... 计算字节长度 ... greatghoul 的答案是对的 ...

    如果是 utf-8 的话 ... 计算字符长度 ... joyeu 的答案是对的 ...

    至于 Theo 的答案里说的 4.1 为临界点的区别 ... 这事情真心和版本没什么关系 ...

    只是因为 4.1 之后才引入字符集支持的口牙!

    如果选 latin1 的话不管什么版本都会计算字节长度的口牙!

    为了避免这个答案看起来是完全照抄了楼上 ... 我提一点其他的东西 ...

    其实这题目里有另外一个坑 ... 就是要保存的东西是 汉字 ...

    如果要保存 utf-8 字符的话 latin1 字符集可以保存 63 - 127 个 ...

    但如果要保存汉字 ... 那么最大数量恐怕只有精确的 85 个 ...

    因为我在码这些字之前自己想尽了一切方法测试都没能找到一个占用四字节的汉字 ...

    怾gi 黁nun 兺bun 乯olo 乭daori 旕eosi 銰ngai 虄sari 哛popuni 硛ceoke 縇seone 穒keweoke

    这组字够不够生僻 ..? 每个字也仅仅占用三字节而已 ...

    至于两字节的汉字 ... 我也找不到 ... greatghoul 说的 〇 是错的 ... 〇占用三字节 ...

    来个总结性陈词 ...

    MySQL 中的 VARCHAR(255) 可以存放 1 - 255 个 UTF-8 格式的汉字 ...

    latin1 字符集最多可以存放 85 个 UTF-8 格式的汉字 ...

    utf-8 字符集最多可以存放 255 个 UTF-8 格式的汉字 ...

    如果谁可以找到一个占用两字节或者占用四字节的汉字那么我的这个答案就错了 ...

    找不到的话可以姑且信之 ...

    以上 ...

    展开全文
  • mysql varchar到底能存多少字符。

    千次阅读 2021-01-18 19:13:39
    大小为64k,即65535字节,而varchar要用1-2字节来存储字段长度,小于255的1字节,大于255的2字节。Mysql 5.0后,英文字符固定都是一字节,汉字字符根据编码方式占不同字节,Utf-8占3字节,gbk占了2字节。第一...

    utf8编码的varchar

    Mysql记录行数据是有限的。大小为64k,即65535个字节,而varchar要用1-2字节来存储字段长度,小于255的1字节,大于255的2字节。

    Mysql 5.0后,英文字符固定都是一个字节,汉字字符根据编码方式占不同字节,Utf-8占3个字节,gbk占了2个字节。

    第一,当编码方式为utf-8时,varchar存到21845就存不下了.也就是最大长度是21844.根据上面信息可以推算出 ( 65535-2 )/3=21844余1

    例子如下:

    ba7bafda5e07073e06f69564f027f5da.png

    9fc4f82a381964cf7b95e2c08a523dcf.png

    GBK编码的varchar

    当编码格式为GBK时,varchar能存多少字符呢?经过推理可知大约能存32766个字符,(65535-2)/2=32766余1。

    那么看看实验结果如下:

    e637c4b7e90226e7eb9eef76360dca52.png

    2b4397794de8bd1fbc8f9ffe42d0037f.png

    为何提出这个问题?

    前段时间一个哥们提bug,要把备注等字段全部最大大小设置为1000,甚至更多,这个表的字段本身就已经很多了,而我们设计表时一般都默认使用utf8这个编码格式,那么一个汉字就占了3个字节,故一个行记录的长度就会短了些,数据占用存储资源也会多了些,然后修改的时候成功的报了row size too large的这个错误。这里提出来也是为了让大家注意下。

    总结

    设计表的时候不同的编码格式会导致varchar的最大值发生变化,varchar(数值),这个数值指的是字符数,也可以说是一个字,但是不是字节,当然存储的数据还是一个英文占一个字节,一个汉字根据编码格式占不同字节。

    展开全文
  • 它对英文使用 8 位(即一字节) ,中文使用 24 位(三字节)来编码。 UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。 UTF-8编码的文字可以在各国支持 UTF8 字符集额的浏览器上显示。 如果是...

    转载来源:https://ruby-china.org/topics/24920

    一、关于 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
    

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

    类型所占字节
    int4 字节
    smallint2 字节
    tinyint1 字节
    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 DigitsNumber Of Bytes
    00
    11
    21
    32
    42
    53
    63
    74
    84

    那: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个字符串 (虽然一个英文字符实际占用一个字节,但是utf-8定义字段时是默认以每个字符最大为3个字节来进行计算的,所以最大为varchar(21844))。

    gbk状态下,汉字最多可以存 32766个字符串,英文也为 32766个字符串(虽然一个英文字符实际占用一个字节,但是gbk定义字段时是默认以每个字符最大为2个字节来进行计算的,所以最大为varchar(32766))。

    展开全文
  • mysql中的Varchar(255)可以放多少个汉字

    万次阅读 2019-07-03 17:44:18
    在字符集为UTF-8的情况下: MySQL | ver < 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8 ...VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。 ...
  • 2、varchar能存多少汉字、数字? 3、varchar的最大长度是多少呢? 4、字符、字节、位,之间的关系? 5、mysql字段类型存储需要多少字节? 接下来请仔细看,整理不易啊。 1、varchar(100)和varchar(10)的区别在...
  • VarChar能存储多少个

    2020-12-18 10:00:31
    参考链接:MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文 首先我们需要了解utf-8和GBK的区别,因为不同的编码格所占的字节数是不同的 中文 英文 utf-8 1~3字节 1字节 GBK 2字节 1字节 ...
  • MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚 一、关于UTF-8 UTF-8Unicode Transformation Format-8bit。是用以解决国际上字符的一种多字节编码。 它对英文使用8位(即一字节) ,...
  • 往期热门文章:1、14 写 Java 的习惯 2、Google 工作十年后,我选择离开! 3、推荐好用的 Spring Boot 内置工具类 4、面试官:内存耗尽后Redis会发生什么 ? 5、监控告警满飞天,运维在家睡到自然醒... 来源:...
  • mysql-varchar在设计数据库字段的时候,varchar类型,是不是纠结过到底该设置为多大呢?看完这篇文章,你搞清楚以下问题:mysql:1、varchar(100)和varchar(10)的区别在哪里?...6、varchar(10)能存多少个字...
  • 比如说我存储5char,二者都是实际占用了5char了【不准确的想法:varchar在实际存储的时候会多一byte用来存放长度】。 但是深入一下,设计数据库的时候,二者一样吗? 答案是否定的【至少varchar类型需要在数据...
  • Mysql 的varchar能存字符?

    千次阅读 2020-11-30 17:48:50
    大小为64k,即65535字节,而varchar要用1-2字节来存储字段长度,小于255的1字节,大于255的2字节。  Mysql 5.0后,英文字符固定都是一字节,汉字字符根据编码方式占不同字节,Utf-8占3字节,gbk占了2字节。 ...
  • 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编码,则...
  • mysql 中的varchar(255) 多少汉字

    万次阅读 2014-11-15 23:20:05
    MySQL 中的 VARCHAR(255) 可以存放 1 - 255 UTF-8 格式的汉字 ... latin1 字符集最多可以存放 85 UTF-8 格式的汉字 ... utf-8 字符集最多可以存放 255 UTF-8 格式的汉字 ... 如果谁可以找到一...
  • 你好,我是李辉。这是专栏的第一篇文章,在专栏的前几小节,我会先和你先聊一聊 MySQL 的数据...这一小节我们就先来说说在数据建模设计时使用非常频繁的字符串类型 – VARCHAR。为了在阅读时不引起歧义,本专栏...
  • 它对英文使用8位(即一字节) ,中文使用24位(三字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集额的浏览器上显示。如果是UTF8编码,则在...
  • 它对英文使用8位(即一字节) ,中文使用24位(三字节)来编码。 UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。 UTF-8编码的文字可以在各国支持UTF8字符集额的浏览器上显示。 如果是...
  • 大小为64k,即65535字节,而varchar要用1-2字节来存储字段长度,小于255的1字节,大于255的2字节。  Mysql 5.0后,英文字符固定都是一字节,汉字字符根据编码方式占不同字节,Utf-8占3字节,gbk占了2字节。 ...
  • MySQL的varchar(255)可以保持多少个汉字

    万次阅读 2016-03-16 14:22:27
    在字符集为UTF-8的情况下: MySQL | ver < 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8 ...VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。
  • 场景介绍: ...1,varchar(100)能存多少个汉字? 具体还是要看版本的,一字符占用3字节 ,一汉字(包括数字)占用3字节=一字符 (1)MySQL 4.0版本以下 varchar(100),指的是100字节,如果存放
  • 输出为 250 255 307 如果某个字段属性为varchar(249)那么第一字符串入库就会报错,如果varchar(254)的话第一字符串存入就会报错。可以看出不管是数字还是字符串是按照单个字符来做基本单位的,只要一字符就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,308
精华内容 4,523
关键字:

varchar(255)能存多少个字