精华内容
下载资源
问答
  • 字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。 字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。 一般...

    一、先了解字节与字符

    1. 字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
    2. 字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&',1、2、3、~!·#、¥、%、…、*、(、)—、+、'汉字'等等。

    一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。

    字节与字符

    • ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
    • UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
    • Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
    • 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
    • UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
    • UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

    单位换算

    • 计算机存储信息的最小单位,称之为位(bit),音译为比特,二进制的一个“0”或一个“1”叫一位。
    • 计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节。一般而言:一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。
    • 计算机存储容量大小以字节数来度量,1024进位制:

      1024B=1K(千)B
      1024KB=1M(兆)B
      1024MB=1G(吉)B
      1024GB=1T(太)B
      以下还有PB、EB、ZB、YB 、NB、DB,一般人不常使用了。

    二、mysql数据库中varchar的长度与字节、字符的关系

    准备sql脚本:

    CREATE TABLE `test` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `content` varchar(5) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into test (id, content) values(default, 'abcde');
    insert into test (id, content) values(default, '12345');
    insert into test (id, content) values(default, '!@#$%');
    insert into test (id, content) values(default, '你好就是我');
    
    select * from test;
    
    
    #查看mysql版本号
    select version();
    

    分析:四条语句(英文字母/数字/字符/中文)都能正确插入(当前mysql版本号8),查询结果如下:

    mysql版本号:

    三、结论

    mysql里的varchar是字符单位,无论内容是英文、数字、字符、中文,都能插入。

    四、拓展

    varchar存储规则:

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

    varchar与char区别:

    • CHAR:固定长度的类型,若输入数据的字符小于指定长度,则系统自动在其后添加空格来填满设定好的空间。
    • VARCHAR:可变长度的类型。数据类型的存储长度为实际数值长度,字符的长度小于指定长度,不会用空格填充。

    参考文章:https://www.runoob.com/w3cnote/byte-character.html

    展开全文
  • 比如常见写法varchar2(10) 代表只接收最大10字节长度 这种定义情况下10字节只能插入3个汉字,(数字字母只占一字节,汉字占三字节) 如果插入4个汉字会报ORA-12899错误,提示超过长度 2、可自定义为字符:VARCHAR2...

    1、默认为字节:byte

    比如常见写法varchar2(10) 代表只接收最大10字节长度

    这种定义情况下10字节只能插入3个汉字,(数字字母只占一字节,汉字占三字节)在这里插入图片描述

    如果插入4个汉字会报ORA-12899错误,提示超过长度

    在这里插入图片描述

    2、可自定义为字符:VARCHAR2(10 char)

    测试建表语句

    CREATE TABLE tUsers1(
         UserName VARCHAR2(10 char)
     ); 
    

    插入测试数据

    INSERT INTO tUsers1(UserName) VALUES('我是中国人我是中国人');
    INSERT INTO tUsers1(UserName)VALUES('你好123');
    

    查询长度会发现oracle中一个汉字占用3个字节

     SELECT lengthb(username),username  FROM tUsers1	
    

    测试效果如下:我们可以看见字段定义为varchar(10 char) 可以插入10个字符(包括汉字),占用最多到30 byte!

    在这里插入图片描述

    另附:

    查询字符集:

    select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
    

    Length与LengthB比较

    lengthb(string)计算string所占的字节长度
    
    length(string)计算string所占的字符长度
    

    MySql

    5.X 以上的版本的定义中表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符.

    4.X 的版本表示的是字节长度,会根据字符集转变内容字节长度存储。

    int(2) 中的2 ,表示的并非是int类型只能输入2位数字,而是只能显示2位数字范围,可以添加11位的int的任何数字。

    SqlServer

    2008中

    select len(‘深圳市中民时代广场B座九楼’) --13
    select datalength(‘深圳市中民时代广场B座九楼’) --25

    展开全文
  • varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。在早期低版本中代表的是字节,具体哪个版本我也没去验证了,后来被改成了字符,不过可以肯定的是在 5.1 版本后, varchar(100) 就是指 100...

    先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。

    varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。

    在早期低版本中代表的是字节,具体哪个版本我也没去验证了,后来被改成了字符,不过可以肯定的是在 5.1 版本后, varchar(100) 就是指 100 个字符。

    说到 varchar ,一般都会拿 char 来做比较说明。

    char 是固定长度,其单位也是字符,比如 char(10),就表示不管你给的什么值,都会被 mysql 固定保存成 10 个字符。

    如果给的字符长度小于 10,那么在尾部就会自动用空格补齐。

    如果大于 10,在严格模式(strict sql mode)下就会报错,在非严格模式下就会对内容做自动截取操作。

    另外 char 也是有最大长度限制的,最大长度为 255, 即 char 类型最多只能保存 255 个字符,char(256) 这都是错误的写法,可以看下面的例子。

    ##创建一个表,同时声明address字段长度为256会报错,最大为255

    mysql> create table test2 ( address char(256) );

    ERROR 1074 (42000): Column length too big for column 'address' (max = 255); use BLOB or TEXT instead

    下面是 char 和 varchar 对于同一个字符所需要的不同的存储空间,这里假设使用的是 latin1 单字节字符集。

    值CHAR(4)存储空间大小(字节)VARCHAR(4)存储空间大小(字节)

    ''' '4 bytes '' 1 byte

    'ab''ab '4 bytes 'ab' 3 bytes

    'abcd''abcd'4 bytes 'abcd' 5 bytes

    'abcdef''abcd'4 bytes 'abcd' 5 bytes

    细心的你可能会发现 varchar 的存储空间会比字符的实际长度多 1 个字节,这是因为 varchar 需要额外增加 1 到 2 个字节来存储字符的长度,这个值被称作前缀。

    也就是说在 varchar 类型中,除了字符本身实际占用的空间外,还需要 1 个或 2 个字节来声明这个字符的长度。

    如果存储的值小于 255 个字节,则使用 1 个字节来存储前缀,如果大于 255 个字节则使用 2 个字节来存储前缀。

    关于字符集和字节的关系,以及字节 (byte) 与位 (bit) 的关系。

    1 byte (字节) = 8 bit (位)

    2^8 = 256

    所以计算机里常见的 255、256 临界值绝大多数与这个有关

    1 个字节具体占多大的空间,这与所使用的字符集有关系

    比如 latin1 单字节字符集,1 个字符即占 1 个字节

    我们常见的 GBK、UTF8、UTF8-MB4 这些都是多字节字符集

    GBK :一个字符最多占 2 个字节

    UTF8:一个字符最多占 3 个字节

    UTF8MB4:一个字符最多占 4 个字节

    好了,再坚持一会,回到文章开头的问题,为啥 varchar 最大长度是 65535 个字节呢,其实这个是受 mysql 另一个规则限制导致的,mysql 规定了每行数据大小不能超过 65535 个字节。

    另外还有一个小问题,一个字段如果允许为 null ,在 mysql 中也是需要增加额外空间来单独标识的,反之则不需要这个额外空间,至于这个空间大小具体是怎么计算的,我目前也还没有研究过。

    结合上面说的几点,下面来通过几个实例来验证下。

    ##字符集设置为latin1,1个字符=1个字节,字段允许为null

    mysql> create table test ( address varchar(65536) default null ) charset=latin1;

    ERROR 1074 (42000): Column length too big for column 'address' (max = 65535); use BLOB or TEXT instead

    ##减去varchar前缀长度标识2个字节,还是报错,说明null标识也占用了空间

    mysql> create table test ( address varchar(65533) default null ) charset=latin1;

    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 test ( address varchar(65533) not null ) charset=latin1;

    Query OK, 0 rows affected (0.01 sec)

    ##如果字符集设置为UTF8,那么 max=65535/3=21845,一个字符最多占3个字节

    mysql> create table test2 ( address varchar(65533) not null ) charset=UTF8;

    ERROR 1074 (42000): Column length too big for column 'address' (max = 21845); use BLOB or TEXT instead

    基于上面几个实例,基本上可以得出计算 varchar 最大长度限制的公式。

    varchar 最大长度限制 = (行最大字节数(65535) - null 标识字节数 - 长度前缀字节数(1或2)) / 字符集单字符占用最多字节数

    看到这里,不知道你有没有一个疑问,为什么长度前缀 1 或 2 个字节就够用了呢,因为 2 个字节的话,2^16 = 65536,这已经超过 mysql 行最大字节数 65535 的限制了,所以 1 到 2 个字节就够用了。

    最后再看一个综合例子,我们创建一个表,采用 UTF8 字符集,添加两个非空字段,分别为 char 和 varchar 类型,char 类型长度给定为 255。

    那么 varchar 类型字段的最大字节数应该就是,

    65535 (行最大字节数) - 255*3 (一个字符最多占 3 个字节) = 64770,

    然后再减去 2 个长度前缀字节,

    64770 - 2 = 64768,

    最后再算出 varchar 最大字符数为 64768 / 3 = 21589.33,

    ##字符数21590超过最大字符数会报错mysql> create table test4 (name char(255) not null, address varchar(21590) not null ) 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

    ##字符数21589则刚好能创建成功mysql> create table test4 (name char(255) not null, address varchar(21589) not null ) charset=utf8;

    Query OK, 0 rows affected, 1 warning (0.02 sec)

    好了,关于 varchar 的最大长度问题就聊到这了,文中如有错误,欢迎大家批评指出,更欢迎大家交流讨论,如果文章对你有帮助,点个赞表示对我的支持哈,感谢。

    展开全文
  • 使用oracle时,会这样忽略一个问题:oracle中varchar2类型的字段长度单位不指定类型时,按照byte来定义。 如果数据库使用的字符集是GBK,GB2312或者其他定长字符集的话,这个问题似乎可以被忽略,因为只要把数据库的...

    1、背景

    使用oracle时,会这样忽略一个问题:oracle中varchar2类型的字段长度单位不指定类型时,按照byte来定义。

    如果数据库使用的字符集是GBK,GB2312或者其他定长字符集的话,这个问题似乎可以被忽略,因为只要把数据库的字段长度/2就可以得到你要限制插入该字段的中文长度了。但是,如果数据库的字符集是UTF-8呢,它可是变长的。

    有人说数据库字段长度/3,这是一定不可取的,因为UTF-8是变长表示的,平均为3byte表示一个字符,而并不是一定用3byte。

    其实人家oracle没这么笨,本来就可以用字符为单位来定义varchar2的长度的,这个时候需要注意在建表时这样写:

    create table ABC_TABLE (A_FIELD varchar2(20 char))  

    2、Length与LengthB比较

    lengthb(string)计算string所占的字节长度 :返回字符串的长度,单位是字节.

    SELECT LENGTHB('我们w') FROM DUAL 

    这里写图片描述

    length(string)计算string所占的字符长度 :返回字符串的长度,单位是字符.

    SELECT LENGTH('我们w') FROM DUAL  

    这里写图片描述

    3、引用

    http://doingwell.iteye.com/blog/972938

    https://www.cnblogs.com/love540376/p/6707974.html

    展开全文
  • varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。在早期低版本中代表的是字节,具体哪个版本我也没去验证了,后来被改成了字符,不过可以肯定的是在 5.1 版本后, varchar(100) 就是指 100...
  • 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8 3字节编码长度),则VARCHAR(255)共可存放约85个汉字; MySQL | ver >= 4.1: VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR...
  • 1、oracle的varcher2的计算单位是字节,mysql的varchar的计算单位是字符; 2、在utf-8下oracle的vachar2保存一个汉字要3个字节,mysql的varchar需要一个字符; 3、在保存数字和字母的时候oracle的vachar2占一个字节...
  • 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-83字节编码长度),则VARCHAR(255)共可存放约85个汉字;MySQL | ver >= 4.1:VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以...
  • varchar2(20)和varchar2(20 byte)区别

    千次阅读 2018-01-09 17:07:17
    varchar2(20)还是varchar2(20 byte)是单位的不同,由数据库参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者是byte(字节),该参数默认值为BYTE 从系统参数中可以知道,默认单位是byt
  • varchar与char的区别

    2020-10-13 10:36:43
    varchar与char的单位都为字节。 假设定义两个数据类型varchar[10]与char[10],当数据大小为3字节时,varchar类型的数据的长度为3字节,而char类型数据会用空格填充数据,使得数据大小为10字节。 ...
  • mysql中varchar与oracle中varchar2区别

    千次阅读 2019-01-03 15:12:23
    字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。 (二)“字符”的定义 字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+...
  • varchar有最大长度吗

    2020-01-06 10:42:54
    varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。 在早期低版本中代表的是字节,具体哪个版本我也没去验证了,后来被改成了字符,不过可以肯定的是在 5.1 版本后, varchar(100)就是指 ...
  • CREATE TABLE `health` (`id` VARCHAR(32) NOT NULL ,`group_id` VARCHAR(32) NOT NULL COMMENT '事业单位id',`perfect` INTEGER NULL COMMENT '完美',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ...
  • Oracle中varchar2(20)和varchar2(20 byte)区别

    千次阅读 2013-03-29 15:08:01
    开发环境中:有的表中字段类型定义为varchar2(20)...相不相同是由数据库的参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者字节(byte),该参数默认值为BYTE。 所以说,在默认情况下 varchar2(20) ...
  • Oracle中varchar2(XX)和varchar2(XX byte)区别 这两个相不相同是由参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者字节(byte),该参数默认值为BYTE。 alter session set nls...
  • 支持超过4000字节的varchar2类型

    千次阅读 2021-04-14 00:19:12
    Oracle中最常用的字符串类型可能就是varchar2了,但是一直以来,让人吐槽最多的,可能就是他的存储容量,12c之前,允许存储4000字节,请注意这的单位是字节,如果你按照非常规的字...
  • oracle提供了五种字符数据类型:char、nchar、varcharvarchar2、nvarchar2。  char:使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格。指定长度时,默认长度的计量单位由...
  • 说明:IDE与数据库字段字符字符集均为UTF-8,MySQl版本5.7.x,JDK1.8.x在设计...先说结论:最长长度即调用java字符串的length方法返回的结果,即数据库字段的长度单位为 字符----------------------------------...
  • 先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。在早...
  • varchar255可以存多少汉字

    万次阅读 2016-05-25 16:24:29
    4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8 3字节编码长度),则VARCHAR(255)共可存放约85个汉字; MySQL | ver >= 4.1: VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR...
  • MySQL varchar存放的字数

    2018-04-26 14:01:33
    4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节) 5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个 ...
  • 数据库中的 varchar(255)

    千次阅读 2018-11-14 16:46:37
    在字符集为UTF-8的情况下: MySQL | ver < 4.1: VARCHAR以字节为单位存储,所以假设全部...VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。  另外,据我所知,My...
  • sql中的 varchar

    2012-07-20 14:11:34
    MySQL中varchar最大长度是多少? http://dinglin.iteye.com/blog/914276   ...CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数 ... 的长度,长度的单位为字符 。一个多字节字符算作一个单...
  • oracle提供了五种字符数据类型:char、nchar、varcharvarchar2、nvarchar2。 char:使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格。指定长度时,默认长度的计量单位由NLS...
  • 记得存储的是字符为单位. 30个字符并不代表是30个字节, 需要根据具体选择的编码格式来进行确定的 列的长度小于255则只是占用一个额外字节用于记录字符串的长度 列的长度大于255则要占用两个额外字节用于纪录字符串...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 586
精华内容 234
关键字:

varchar单位