`
darrenzhu
  • 浏览: 782399 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Mysql Varchar字符长度

阅读更多
`sku_name` VARCHAR(200) NOT NULL COMMENT '商品名称'
innoDB 引擎, utf8mb4编码

上面的sku_name定义的长度为200,那么这个200是指字节数还是字符数目?
经过测试得出结论,200是字符数目不是字节数目。
SELECT sku_code, sku_name, length(sku_name) as len FROM msm_sku;
SELECT sku_code, sku_name, char_length(sku_name) as len FROM msm_sku;
通过上面的2条SQL语句可以知道字节数和字符数。

假如: sku_name='双汇火腿肠500克'
length(sku_name) = 6个汉字所占字节数 + 3个ASCII码所占字节数 = 6*3+3*1 = 21;
char_length(sku_name) = 字符总数 = 6个汉字+3个ASCII字符=9


详解请参考
MySQL中char与varchar区别,varchar最大长度是多少?
https://www.cnblogs.com/jewave/p/6214540.html


一、首先来说下字符与字节的区别:

字符与字节它们完全不是一个位面的概念,所以两者之间没有“区别”这一说法。在不同编码里,字符和字节的对应关系是不同的。一般来说,半角英文状态下一个字母或数字(称之为字符)占用一个字节,一个汉字用两个字节表示。在不同的编码方式下一个字符占的字节数是不同的,所以两者是不能划等号的。

1个字节(Byte)等于8个bit位,每个bit位是0/1两种状态,也就是说一个字节可以表示256个状态,计算机里用字节来作为最基本的存储单位。

字符,在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。

字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。

①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。

②UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

③Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。

文本符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

④UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。

⑤UTF-32编码中,世界上任何字符的存储都需要4个字节。

二、varchar和char 的区别:

  char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是: char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

  在MySQL中用来判断是否需要进行对据列类型转换的规则

  1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.

  2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.

  3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.例外:长度小于4个字符的char数据列不会被转换varchar类型

在mysql中,char和varchar都表示字符串类型.但他们存储和检索数据的方式并不相同.

在表结构定义中声明char和varchar类型时,必须指定字符串的长度.也就是该列所能存储多少个字符(不是字节,是字符).例如:char(10)和varchar(10)都能存储10个字符.

声明为char的列长度是固定的,char的长度可选范围在0-255之间.也就是char最大能存储255个字符.如果该列是utf8编码,则该列所占用的字节数=字符数*3.如果是gbk编码则该列所占用的字节数=字符数*2.

声明为varchar的列长度是可变的,在mysql5.0.3之前varchar的长度范围为0-255,mysql5.0.3之后varchar的长度范围为0-65535个字节.采用varchar类型存储数据需要1-2个字节(长度超过255时需要2个字节)来存储字符串的实际长度.如果该列的编码为gbk,每个字符最多占用2个字节,最大长度不能超过32766个字符.如果该列的编码为utf8,每个字符最多占3个字节,最大字符长度为21845.

总结:

① char和varchar最大的不同就是一个是固定长度,一个是可变长度.由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪.

②varchar(M)和char(M),M都表示字符数.varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同.char最多可以存放255个字符,不同的编码最大可用字节数不同.

length()与char_length()

length():Return the length of a string in bytes.返回字符串所占的字节数(受编码影响).

char_length():Return number of characters in argument.返回字符串中的字符数.



test:

1.建表

create table t_char_test(
id int(11) primary key,
name_char char(10) ,
name_varchar varchar(10)
)engine=Myisam default charset=utf8;

insert into t_char_test(id,name_char,name_varchar) values (0,'字符类型','字符类型');

结果集如下:





3、varchar最大长度是多少?

varchar存储规则:

  4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节
Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同。

  这不是一个固定的数字。先简要说明一下限制规则。

  1、限制规则

  字段的限制在字段定义的时候有以下规则:

  a) 存储限制

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

  b) 编码长度限制

  字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

  字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

  若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

  c) 行长度限制

  导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

  ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

  2、计算例子

  举两个例说明一下实际长度的计算。

  a) 若一个表只有一个varchar类型,如定义为

  create table t4(c varchar(N)) charset=gbk;

  则此处N的最大值为(65535-1-2)/2= 32766。

  减1的原因是实际行存储从第二个字节开始’;

  减2的原因是varchar头部的2个字节表示长度;

  除2的原因是字符编码是gbk。

  b) 若一个表定义为

  create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

  则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

  减1和减2与上例相同;

  减4的原因是int类型的c占4个字节;

  减30*3的原因是char(30)占用90个字节,编码是utf8。

  如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

  则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

  create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

  create table t5(c int, c2 varchar(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

  varchar(30)和char(30)最多能存放:

  工在基工左基工在基顺工作奔大规模集成电路城工作东奔西走左夺工城鞯革城载模压地工魂牵梦萦栽土木工程魂牵梦萦栽植奇巧魂牵梦萦地厅城柑模压东奔西走苦村落模压革革柑可耕地村模压基栽魂牵梦基

  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

  111111111111111111111111111111111111111111111111111111

  111111111111111111111111111111111111

分享到:
评论

相关推荐

    Mysql中varchar长度设置方法

    主要介绍了Mysql中varchar长度设置方法的相关资料,本文还给大家带来了valar类型的变化及char()和varchar()的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Mysql varchar大小长度问题介绍

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

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

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

    MySQL索引长度限制原理解析

    这篇文章主要介绍了MySQL索引长度限制原理解析,文中通过示例代码...varchar的最大长度是指字符长度,若数据库字符集为utf-8,则一个字符占3个bytes。因此在utf-8字符集下,innodb引擎创建的单列索引长度不能超过255个

    MySQL中随机生成固定长度字符串的方法

    要随机生成字符串代码如下: 在MySQL中定义一个随机串的方法,然后再SQL语句中调用此方法。 随机串函数定义方法: 代码如下: CREATE DEFINER=`root`@`localhost` FUNCTION `rand_string`(n INT) RETURNS varchar(255...

    探究MySQL中varchar的定义长度

    主要介绍了探究MySQL中varchar的定义长度,文中主要对其长度究竟是字节还是字符做出了相关实验,需要的朋友可以参考下

    php判断输入不超过mysql的varchar字段的长度范围

    但是如果在utf-8编码下,一个汉字是占3个字符长度的,比如字符串$str=”你好啊!!”; 如果你用strlen函数来判断,长度是11,正好超过了varchar的长度,但实际上确不是这样,如果直接到phpmyadmin里面执行insert语句,...

    MYSQL中 char 和 varchar的区别

    CHAR和VARCHAR相同的是:CHAR和VARCHAR都指定了字符长度,注意是字符长度。例如char(30) 和 varchar(30)表示都可以存30个字符。有一点要注意的是在utf8mb4编码中,每个字符占4个节点。在utf8中,每个字符占3个字节。...

    MySQL中字段类型char、varchar和text的区别

    在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。 它们的存储方式和数据的检索方式也都不一样。 数据的检索效率是:char > varchar ...

    mysql VARCHAR的最大长度到底是多少

    以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的不过后来群里有人给了解释,突然才发现原来事情不是这么简单 MYSQL COMPACT格式,每条记录有一个字节来表示NULL...

    MySQL数据库char与varchar的区别分析及使用建议

    现在我们需要考虑的是,在什么情况下使用Char字符型数据,什么情况下采用 Varchar字符型数据。 一、VARCHAR与CHAR字符型数据的差异 在MySQL数据库中,用的最多的字符型数据类型就是Varchar和Char.。这两种数据类型...

    GP数据库表结构转mysql库、oracle库 varchar类型字段长度批量处理excel_MYSQL_oracle_数据库

    oracle数据库表结构转gp数据库表结构、转mysql、数据库时表字段长度问题

    MySQL数据类型varchar详解

    1、varchar(N)的逻辑意义从MySQL4.1开始,varchar (N)中的N指的是该字段最多能存储多少个字符(characters),不是字节数。不管是一个中英文字符或者数字、或者一个汉字,都当做一个字符。在4.1之前,N表示的是最大...

    varChar和Char之间的区别?

    1.char的长度不可变,二varchar的长度是可变的; 2.char的存取速度比varchar要快,应为长度固定,方便程序的存储和查找; 3.char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar...

    mysql中char与varchar的区别分析

    而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。所以实际应用中用户可以根据自己的数据类型来做。 再看看char,与varchar在速度上的区别吧。 代码如下: mysal>create tabe ab(v varchar(4),c char...

    mysql 截取指定的两个字符串之间的内容

    如 现有字符串 “[]aseabcd[12345]ddxabcdsx[]”,要截取”abcd[” 和 “abcd[“之后的第一个 “]” 之间的内容 “12345”,当然当中的内容长度不是固定的,可以是”123456″ 或者其他字符串。 他问我的时候,我第一...

    SQL数据类型和范围(SQLServer,MySql,Access)

    varchar(n) 可变长度的字符串。最多 8,000 个字符。 varchar(max) 可变长度的字符串。最多 1,073,741,824 个字符。 text 可变长度的字符串。最多 2GB 字符数据。 Unicode 字符串 数据类型 描述 存储 ...

    Grails GORM 自动建表失败,且无错误提示信息

    今天遇到一个情况,GORM 根据 class 自动建表失败,且没有任何提示信息...因为 mysql varchar 最大字节长度是 65535,因此 varchar 最大字符长度是 65535/3 = 21845。 造成错误的代码: class Trade { String orderStr

Global site tag (gtag.js) - Google Analytics