精华内容
下载资源
问答
  • ORACLE的VARCHAR2是字节还是字符

    千次阅读 2018-04-02 14:13:00
    往Oracle一个表的VACHAR2(20)字段中插入七个汉字,提示错误:插入的值太大。...字符集设置成ZHS16GBK:汉字占2字节字符集设置成AL32UTF8:汉字占3个字节。 查询字符集:select * from v$nls_parameters t wher...

    Oracle一个表的VACHAR2(20)字段中插入七个汉字,提示错误:插入的值太大。

    改成插入六个汉字,又可以。

     

    于是百度,原来这与ORACLE的字符集设置有关。(以前的项目都是设置成的ZHS16GBK)

    字符集设置成ZHS16GBK:汉字占2个字节。

    字符集设置成AL32UTF8:汉字占3个字节。

    查询字符集:select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';

     

    展开全文
  • mysql-varchar在设计数据库字段的时候,varchar...2varchar能存多少汉字、数字?3、varchar的最大长度多少呢?4、字符字节、位,之间的关系?5、mysql字段类型存储需要多少字节?6、varchar(10)能存多少个字...
    5cf09792d35a0bb360ec1f5accfabd6e.png

    mysql-varchar

    在设计数据库字段的时候,varchar类型,是不是纠结过到底该设置为多大呢?

    看完这篇文章,你能搞清楚以下问题:

    mysql:

    1、varchar(100)和varchar(10)的区别在哪里?

    2、varchar能存多少汉字、数字?

    3、varchar的最大长度是多少呢?

    4、字符、字节、位,之间的关系?

    5、mysql字段类型存储需要多少字节?

    6、varchar(10)能存多少个字符?

    1、varchar(100)和varchar(10)的区别在哪里?一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【不准确的想法:varchar在实际存储的时候会多一个byte用来存放长度】。但是深入一下,设计数据库的时候,二者一样吗?答案是否定的【至少varchar类型需要在数据之前利用一个或者两个字节来存储数据的长度】并且二者在内存中的操作方式也是不同的,下面的例子中有体现如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?

    结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其是使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。我这里大概说下:假设VARCHAR(100)与VARCHAR(200)类型,实际存90个字符,它不会对存储端产生影响(就是实际占用硬盘是一样的)。但是,它确实会对查询产生影响,因为当MySql创建临时表(SORT,ORDER等)时,VARCHAR会转换为CHAR,转换后的CHAR的长度就是varchar的长度,在内存中的空间就变大了,在排序、统计时候需要扫描的就越多,时间就越久。

    所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

    char

    1、从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。2、考虑其长度的是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常适和采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。

    总结

    二者在磁盘上存储占的空间是一样的。区别有二。第一、一个变长一个固定长度。第二、在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的。

    2、varchar能存多少汉字、数字?具体还是要看版本的,一个字符占用3个字节 ,一个汉字(包括数字)占用3个字节=一个字符

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

    UTF8编码中一个汉字(包括数字)占用3个字节

    GBK编码中一个汉字(包括数字)占用2个字节

    3、varchar的最大长度是多少呢?mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533,其中需要1到2个字节来存储数据长度(如果列声明的长度超过255,则使用两个字节来存储长度,否则1个)字节,当不允许非空字段的时候(因为要用一个字节来存储不可为空的标识),当允许非空字段的时候只能到65532(省下了存储非空的那个字节)。

    行中可以用的字节数如下计算:(参考文档:https://www.jianshu.com/p/ee1e4b14c5e7 )

    字段非空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) - 1 (null byte)=65531 字节可以用

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

    字段可以空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) =65532 字节可以用

    根据这个最大字节数,以及编码方式,可以计算能存储的汉字数。

    4、字符、字节、位,之间的关系?

    1、位:数据存储的最小单位。每个二进制数字0或者1就是1个位;2、字节:8个位构成一个字节;

    即:1 byte (字节)= 8 bit(位);

    1 KB = 1024 B(字节);1 MB = 1024 KB; (2^10 B)1 GB = 1024 MB; (2^20 B)1 TB = 1024 GB; (2^30 B)

    3、字符:

    a、A、中、+、*、の……均表示一个字符;一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节;数字属于汉字,和汉字占用一样字节。一般 gbk 编码下,一个汉字 字符 占用 2 个 字节;

    5、mysql字段类型存储需要多少字节?

    字段类型:TINYINT----一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。

    SMALLINT-----一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。

    MEDIUMINT----一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。

    INT----一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。

    INTEGER-----INT的一个同义词。

    BIGINT-------一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。

    FLOAT------一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和 1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个 参数表示一个单精密浮点数字。

    DOUBLE------一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。

    DOUBLE PRECISION、REAL[(M,D)] [ZEROFILL] 这些是DOUBLE同义词。

    DECIMAL------一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。

    NUMERIC----- 这是DECIMAL的一个同义词。

    DATE -------一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。

    DATETIME -------一个日期和时间组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。

    TIMESTAMP------一个时间戳记。范围是'1970-01-01 00:00:00'到2037年的某时。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,你以可以通过赋给它一个NULL值设置它为当前的日期和时间。

    TIME -----一个时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。

    YEAR-----一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类型。)

    CHAR------一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是 1——255 个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。

    VARCHAR------一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是 1——65532 个字符,1个或2个字节用来保存字符串长度。VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。VARCHAR是CHARACTER VARYING一个缩写。

    TINYBLOB 、TINYTEXT 一个BLOB或TEXT列,最大长度为255(2^8-1)个字符

    BLOB 、TEXT -----一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符

    MEDIUMBLOB、MEDIUMTEXT ------一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符

    LONGBLOB 、LONGTEXT ------一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符

    ENUM-----枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL。一个ENUM最多能有65535不同的值。

    SET-----一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。

    展开全文
  • 首先 mysql 5.X 以上的版本的 定义中 表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符。 表示的字符长度。 ORACLE 往Oracle一个表的VACHAR2(20)字段中插入七个汉字 提示错误...

    MYSQL

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

    ORACLE

    往Oracle一个表的VACHAR2(20)字段中插入七个汉字
    提示错误:插入的值太大。

    改成插入六个汉字,就可以。

    于是百度,原来这与ORACLE的字符集设置有关。

    字符集设置成ZHS16GBK:汉字占2个字节。

    字符集设置成AL32UTF8:汉字占3个字节。

    查询字符集:select * from v$nls_parameters t where t.PARAMETER=‘NLS_CHARACTERSET’;
    在这里插入图片描述

    展开全文
  • 4.X 的版本表示的是字节长度,会根据字符集转变内容字节长度存储。 int(2) 中的2 ,表示的并非是int类型只能输入2位数字,而是只能显示2位数字范围,可以添加11位的int的任何数字。 Oracle Oracle中varchar2...

    MySql

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

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

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

     

    Oracle

    Oracle中varchar2类型的字段长度单位默认是按照byte来定义,也可以用字符为单位来定义varchar2的长度的,这个时候需要注意在建表时这样写:create table ABC_TABLE (A_FIELD varchar2(20 char))

    查询字符集:select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';

    Length与LengthB比较

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

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

     

    SqlServer

    经测试是指的字符长度

     


     

    展开全文
  • Oracle中varchar2类型的字段长度单位默认按照byte来定义, 比如常见写法varchar2(10) 代表只接收最大10字节长度 这种定义情况下10字节只能插入3个汉字,(数字字母只占一字节,汉字占三字节) 如果插入4个汉字...
  • mysql varchar(20) 20个字节 还是 20个字符? 这个问题一直有那么一点点的乱。刚好今天有空整理一下MySQL4.1前的 varchar(20) 20个字节。最大的限制255字节MySQL5.0以后 varchar(20)20个字符。最大的限制...
  • 1.我们经常 mysql创建 varchar(20) name这个 20长度 究竟是表示的字符还是字节数?根编码字符集又有没有关系?...mysql 4.X 的版本表示的是字节长度,会根据字符集转变 内容字节长度存储。 2.关于 int(...
  • Mysql varchar 字节长度

    千次阅读 2018-03-23 17:35:53
    1.我们经常 mysql创建 varchar(20) name这个 20长度 究竟是表示的字符还是字节数?... 表示的字符长度mysql 4.X 的版本表示的是字节长度,会根据字符集转变 内容字节长度存储。2.关于 int(2) ...
  • 如题 mysql数据库中,CHAR(100),VARCHAR(200),INTEGER(11),DOUBLE(15,2)括号里面的数字是字节还是字符
  • 2:一个汉字的两个字节中,第一个字节字符>127,第二个 字节就不一定了 3:例如: [code] char cStr[81]="abc123你好123abc"; for(int i=0;i127)//第i与i+1这两个字节是一个汉字 ....
  • oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串... 首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节数都4000。 varchar2(byte):就是默认的表示方式,比如我们写成:v...
  • varchar和varchar2的区别

    2021-03-11 19:04:29
    varchar是标准sql里面的;varchar2是oracle提供的独有的数据类型。 varchar对于汉字占两个字节,对于数字,英文字符是一个字节,占的内存小;varchar2一般情况下把所有字符都占两字...varchar2是存放可变长度的字符
  • varchar适合长度不固定的字符串存储,不会处理尾部空格,而且实际存储占用的空间会加1或2(因为要记录长度 1个字节 =8位 11111111=128+64+32+16+8+4+2+1=255 所以不超过255得就只用1个字节 redis5 String的设计原...
  • varchar是标准sql里面的。varchar2是oracle提供的独有的数据类型。 varchar对于汉字占两个字节,对于数字,英文字符是一个字节,占的...varchar存放固定长度的字符串,最大长度是2000,varchar2是存放可变长度的字符.
  • 1. char 和 varchar的区别 char的长度固定的,在存储中比如存储“abc”,char(6),实际在库中存储的“abc ” varchar 长度可变的,还是以上例子,在库中存储的就是“abc...varchar2 存储任何字符都按照两个字...
  • 无论是varchar2还是nvarchar2,最大字节数都是4000。 varchar2(byte) 存储的是字节varchar2(byte):就是默认的表示方式,比如我们写成:varchar2(100),就相当于varchar2(100 byte),表示最大字节数是100,该...
  • char(L),varchar(L): ​ L,表示每个数据的最大长度!单位 字符数(不是字节数) ​ L的值不是多大都可以!...​ 测试发现只有一个字段,而且字节字符集,还是不能65535,原因? ​ 为什么 6553...
  • varchar2(20)和varchar2(20 byte)区别

    千次阅读 2018-01-09 17:07:17
    varchar2(20)还是varchar2(20 byte)单位的不同,由数据库参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者byte(字节),该参数默认值为BYTE 从系统参数中可以知道,默认单位byt
  • size的最大值2000,单位是字符,不管字母还是汉字,每个字符的长度都两个字节,所以nvarchar2类型的数据最多存放2000个汉字或字母,并且不受数据库字符集的影响 varchar2(size type) varchar2最多存放4000...
  • varchar2(byte)、varchar2(char)、nvarchar2()。 Oracle数据库相信大家都...首先,我们要时刻记清:无论是varchar2还是nvarchar2,最多可以存储4000字节varchar2(byte): 就是默认的表示方式,比如我们写成:varcha
  • varchar2与nvarchar2的区别

    千次阅读 2017-08-05 19:29:15
    varchar2与nvarchar2的区别...varchar2最多存放4000字节的数据,不管typechar还是byte。所以如果你设置varchar2(4000 char),你可以存入4000个字母,但是不能存入4000个汉字。如果数据库字符集编码GBK,那么varcha
  • varchar2最多存放4000字节的数据,不管typechar还是byte。所以如果你设置varchar2(4000 char),你可以存入4000个字母,但是不能存入4000个汉字。如果数据库字符集编码GBK,那么varchar2最多能存放2000个汉字,...
  • 1.定长和不定长 ①char(M) 类型,每个值都占用 M 个字符,如果某个值小于M,mysql就...而 varchar ,最后一个字符还是记录的字符长度,计算机处理的时候,还要计算最后这个字符,所以有额外的计算 相比较之下,char的

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

varchar2是字节还是字符