精华内容
下载资源
问答
  • char、varcharvarchar2区别
    千次阅读
    2021-01-28 04:07:12

    char varchar varchar2 的区别 区别: 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc,对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大,当你存储的

    char varchar varchar2 的区别

    区别:

    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。

    2.CHAR的效率比VARCHAR2的效率稍高。

    3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。

    何时该用CHAR,何时该用varchar2?

    CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.

    VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。

    VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

    char varchar nchar nvarchar 四者的区别

    1、char[(n)]

    长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在 SQL-92 中的同义词为 character。

    2、varchar[(n)]

    长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。

    如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。

    将为使用 char 或 varchar 的对象被指派数据库的默认排序规则,除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的代码页。

    支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar:

    如果希望列中的数据值大小接近一致,请使用 char。

    如果希望列中的数据值大小显著不同,请使用 varchar。

    如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF,则一个定义为 NULL 的 char 列将被作为 varchar 处理。

    当排序规则代码页使用双字节字符时,存储大小仍然为 n 个字节。根据字符串的不同,n 个字节的存储大小可能小于 n 个字符。

    nchar 是固定长度 Unicode 数据的数据类型,nvarchar 是可变长度 Unicode 数据的数据类型,二者均使用 UNICODE UCS-2 字符集。

    3、nchar(n)

    包含 n 个字符的固定长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。存储大小为 n 字节的两倍。nchar 在 SQL-92 中的同义词为 national char 和 national character。

    3、nvarchar(n)

    包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。nvarchar 在 SQL-92 中的同义词为 national char varying 和 national character varying。

    如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。

    如果希望列中所有数据项的大小接近一致,则使用 nchar。

    如果希望列中数据项的大小差异很大,则使用 nvarchar。

    使用 nchar 或 nvarchar 的对象被赋予数据库的默认排序规则,除非使用 COLLATE 子句赋予特定的排序规则。

    SET ANSI_PADDING OFF 不适用于 nchar 或 nvarchar。SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。

    ===========================================================================

    nchar(n)

    包含 n 个字符的固定长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。存储大小为 n 字节的两倍。nchar 在 SQL-92 中的同义词为 national char 和 national character。

    nvarchar(n)

    包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。nvarchar 在 SQL-92 中的同义词为 national char varying 和 national character varying。

    注释

    如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。

    如果希望列中所有数据项的大小接近一致,则使用 nchar。

    如果希望列中数据项的大小差异很大,则使用 nvarchar。

    使用 nchar 或 nvarchar 的对象被赋予数据库的默认排序规则,除非使用 COLLATE 子句赋予特定的排序规则。

    SET ANSI_PADDING OFF 不适用于 nchar 或 nvarchar。SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。

    二、char 和 varchar

    固定长度 (char) 或可变长度 (varchar) 字符数据类型。

    char[(n)]

    长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在 SQL-92 中的同义词为 character。

    varchar[(n)]

    长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。

    注释

    如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。

    将为使用 char 或 varchar 的对象被指派数据库的默认排序规则,除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的代码页。

    支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar:

    如果希望列中的数据值大小接近一致,请使用 char。

    如果希望列中的数据值大小显著不同,请使用 varchar。

    如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF,则一个定义为 NULL 的 char 列将被作为 varchar 处理。

    当排序规则代码页使用双字节字符时,存储大小仍然为 n 个字节。根据字符串的不同,n 个字节的存储大小可能小于 n 个字符。

    总结:

    1、 varchar:

    可变长度的非 Unicode 数据,最长为 8,000 个字符。

    2、nvarchar:

    可变长度 Unicode 数据,其最大长度为 4,000 字符。

    3、char:

    固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。

    4、nchar

    固定长度的 Unicode 数据,最大长度为 4,000 个字符。

    5、 char和varchar都是字符串类型的

    用Unicode编码的字符串,结果是字符的整数值

    ================================================================================================================================

    char是定长的,varchar是变长的。

    varchar2应该是varchar的升级,似乎只有ORACLE才有,这里不作讨论。

    char定长存储,速度快,但是存在一定的空间浪费,适用于字段不是很大,对速度要求高的场合。速度快是因为其在物理上是按定长存储的,这样,就可以根据偏移址一次取出固定长度的字符。

    varchar变长存储,所以效率不如char。varchar在存储时,在物理上要先存储该字段的实际长度,然后才是内容。这样读取的时候,就要读取两次,一次读它的长度,然后才是内容。所以它的访问速度会比char慢一些。但它可以节省空间。

    由于mysql自身的特点,如果一个数据表存在varchar字段,则表中的char字段将自动转为varchar字段。在这种情况下设置的char是没有意义的。所以要想利用char的高效率,要保证该表中不存在varchar字段;否则,应该设为varchar字段。

    SQL中char、varchar、text和nchar、nvarchar、ntext的区别

    1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。

    2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。

    从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

    3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

    4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

    所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar。

    ------------------------

    数据库定义到char类型的字段时 char、nchar、varchar、nvarchar、text、ntext中哪一种呢?

    数据库定义到char类型的字段时,不知道大家是否会犹豫一下,到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢?结果很可能是两种,一种是节俭人士的选择:最好是用定长的,感觉比变长能省些空间,而且处理起来会快些,无法定长只好选用定长,并且将长度设置尽可能地小;另一种是则是觉得无所谓,尽量用可变类型的,长度尽量放大些。

    鉴于现在硬件像萝卜一样便宜的大好形势,纠缠这样的小问题实在是没多大意义,不过如果不弄清它,总觉得对不起劳累过度的CPU和硬盘。

    下面开始了(以下说明只针对SqlServer有效):

    1、当使用非unicode时慎用以下这种查询:

    select f from t where f = N'xx'

    原因:无法利用到索引,因为数据库会将f先转换到unicode再和N'xx'比较

    2、char 和相同长度的varchar处理速度差不多(后面还有说明)

    3、varchar的长度不会影响处理速度!!!(看后面解释)

    4、索引中列总长度最多支持总为900字节,所以长度大于900的varchar、char和大于450的nvarchar,nchar将无法创建索引

    5、text、ntext上是无法创建索引的

    6、O/R Mapping中对应实体的属性类型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性来说,可变长度的类型更加吻合

    7、一般基础资料表中的name在实际查询中基本上全部是使用like '%xx%'这种方式,而这种方式是无法利用索引的,所以如果对于此种字段,索引建了也白建

    8、其它一些像remark的字段则是根本不需要查询的,所以不需要索引

    9、varchar的存放和string是一样原理的,即length {block}这种方式,所以varchar的长度和它实际占用空间是无关的

    10、对于固定长度的字段,是需要额外空间来存放NULL标识的,所以如果一个char字段中出现非常多的NULL,那么很不幸,你的占用空间比没有NULL的大(但这个大并不是大太多,因为NULL标识是用bit存放的,可是如果你一行中只有你一个NULL需要标识,那么你就白白浪费1byte空间了,罪过罪过!),这时候,你可以使用特殊标识来存放,如:'NV'

    11、同上,所以对于这种NULL查询,索引是无法生效的,假如你使用了NULL标识替代的话,那么恭喜你,你可以利用到索引了

    12、char和varchar的比较成本是一样的,现在关键就看它们的索引查找的成本了,因为查找策略都一样,因此应该比较谁占用空间小。在存放相同数量的字符情况下,如果数量小,那么char占用长度是小于varchar的,但如果数量稍大,则varchar完全可能小于char,而且要看实际填充数值的充实度,比如说varchar(3)和char(3),那么理论上应该是char快了,但如果是char(10)和varchar(10),充实度只有30%的情况下,理论上就应该是varchar快了。因为varchar需要额外空间存放块长度,所以只要length(1-fillfactor)大于这个存放空间(好像是2字节),那么它就会比相同长度的char快了。

    13、nvarchar比varchar要慢上一些,而且对于非unicode字符它会占用双倍的空间,那么这么一种类型推出来是为什么呢?对,就是为了国际化,对于unicode类型的数据,排序规则对它们是不起作用的,而非unicode字符在处理不同语言的数据时,必须指定排序规则才能正常工作,所以n类型就这么一点好处。

    总结:

    1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char

    2、能确定长度又不一定是ansi字符或者,那么用nchar;

    3、不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400;

    4、不查询的话没什么好说的,用nvarchar(4000)

    5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度为X位的数据

    f68f2add0b68e4f9810432fce46917b7.png

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    更多相关内容
  • 如果某一项中设置的是varchar(50) 那么对英文当然是50 那么对中文呢 utf-8的中文占3个字节 那么,这个varchar(50)是不是只能存16个汉字了? mysql varchar(50) 不管中文 还是英文 都是存50个的 MySQL5的文档,...
  • char是定长的 char(10) varchar2(10) 同样存 a ,char占用了10个字符,varchar2 只占用了 一个字符(一个中文占两个字符,英文占一个)。 但是char的查询速度要比varchar2快。varchar2,Oracle还要进行语法分析,这...
  • 主要介绍了探究MySQL中varchar的定义长度,文中主要对其长度究竟是字节还是字符做出了相关实验,需要的朋友可以参考下
  • 今天群里有人问varchar 不是最大应该只可以设置65532(第一个字节+两个长度字节)吗 ,但是为什么可以设置成65533
  • 主要介绍了MySQL动态修改varchar长度的方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 主要给大家详细介绍了关于Oralce中VARCHAR2()与NVARCHAR2()的区别,文中先通过翻译官方的介绍进行区别总结,然后由一个实战示例代码进行演示,相信对大家的理解会很有帮助,有需要的朋友们下面来跟着小编一起看看吧...
  • 主要介绍了Mysql数据库中把varchar类型转化为int类型的方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • NULL 博文链接:https://wy649898543.iteye.com/blog/1446712
  • VARCHAR的最大长度、字符串类型选择,用MySQL的人中十之七八是不清楚的。网上文章鱼目混珠,以讹传讹居多。 本文不止介绍了原理,还提供了案例手把手教你自己分析,彻底解决你的疑惑

    如果要了解MySQL其他类型长度,可以参考《MySQL字段长度、取值范围、存储开销》

    以我多年经验来看,VARCHAR的最大长度、字符串类型选择,用MySQL的人中十之七八是不清楚的。网上文章鱼目混珠,以讹传讹居多。
    本文不止介绍了原理,还提供了案例手把手教你自己分析,彻底解决你的疑惑。

    假设有个VARCHAR(64) CHARSET utf8mb4列,存储了中国cn这个字符串。
    那你猜一猜,MySQL存储时用了多少字节?

    • A:4 Bytes
    • B:5 Bytes
    • C:8 Bytes
    • D:9 Bytes
    • E:10 Bytes
    • F:10.125 Bytes
    • G:11 Bytes
    • H:12 Bytes
    • I:12.125 Bytes
    • K:13 Bytes

    正确答案是F和G。

    如果您没猜对,那么花7~10分钟读完本文,即可破解这一谜题。成长快乐轻轻松松。

    本文内容适用于MySQL 5.5/5.6/5.7/8.x

    VARCHAR的定义

    VARCHAR是变长字符串。
    考虑其变长原理中有较多要素,在具体分解前,有必要一起重温下官方定义。

    为了便于理解,我用CHAR定长类型来对比介绍。先看两个小例子:

    • VARCHAR(4),最多存储4个字符,有几个字符存储几个。存储字节数 = 数据值的字节和 + 1字节(长度标识,后面会讲到)
    • CHAR(4),最多存储4个字符,不足4个尾部用空格填满。存储字节数 = 数据值的字节和 + 补位空格数

    概括地说,VARCHARCHAR都是MySQL的字符串类型,存储多个字符、可设置最大存储的字符数,存储开销都与数据长度、字符集有关。是MySQL最常用的字符串类型。

    CHARVARCHAR具体对比:

    特性CHARVARCHAR
    长度定长,固定字符数
    最大255个字符
    数据长度不足声明值时,在尾部自动填充空格
    长度可变,可设置最大存储字符数
    最大不超过行大小(默认65535字节,注意是字节,下面会讲原因)
    前缀1~2字节,看列长度是否可能超过255字节
    比如VARCHAR(100),字符集为UTF8,则字节最大可能为300字节,所以会使用2个字节标识长度
    有否尾部空格长度不足默认用空格填满
    检索和获取时会自动去除
    不会自动填充空格输入值就包含空格,则会存储,检索和获取数据都会体现
    超长处理超长部分如果是空格自动截断
    如果是字符,严格模式下会报错
    超长部分如果是空格自动截断,并生成警告
    如果是字符,严格模式下会报错
    存储开销数据值的字节和 + 补位空格数数据值的字节和 + 长度标识字节数
    • 如果开启PAD_CHAR_TO_FULL_LENGTH模式,检索时尾部空格不会去除
    • CHAR超过255字符会报错,提示使用TEXTBLOB
      ERROR 1074 (42000): Column length too big for column ''long_char'' 	(max = 255); use BLOB or TEXT instead
      

    这是两个类型的简单介绍。要了解MySQL类型详细内容,可参考《MySQL字段长度、取值范围、存储开销》

    VARCHAR的最大长度


    在MySQL官方定义中,常用的COMPACTDYNAMIC行模式下,最大长度受几个因素影响:

    • 行存储的最大字节数
    • 数据之外的存储开销,官方定义中包括:NULL标识长度标识
    • 存储字符的字符集

    算法如下:
    最大长度(字符数) = (行存储最大字节数 - NULL标识列占用字节数 - 长度标识字节数) / 字符集单字符最大字节数。有余数时向下取整。

    关于MySQL行大小定义,可参考《MySQL字段长度、取值范围、存储开销》

    下面通过逐步实例验证,演示如何计算出最大长度。

    最大行大小

    MySQL行默认最大65535字节,是所有列共享的,所以VARCHAR的最大值受此限制。
    接下来,我们要创建一个65536字节的VARCHAR,来验证这个边界值。

    前面讲过,VARCHAR声明的长度是指字符数。要换算为65536字节,最好一个字符只占一个字节。
    所以这里使用了latin1字符集(MySQL默认字符集,不指定即为默认)。
    要了解更多MySQL字符集,可参考《MySQL有哪些字符集?如何使用?》

    mysql> create table test_varchar_length(v varchar(65536) not null);
    ERROR 1074 (42000): Column length too big for column 'v' (max = 65535); use BLOB or TEXT instead
    

    可以看到报错了,提示我们行最大长度为65535字节。
    如果我们要插入一个非空的VARCHAR,其最大长度不能超过65535(行最大值) - 2(长度标识位) = 65533字节(长度标识位需2字节才能表示216=65536个数字):

    /** 测试边界值65534,确认仍然过大;注意这里使用默认字符集latin1、单字节字符集 */
    mysql> create table test_varchar_length(v varchar(65534) not null); 
    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
    
    /** 测试边界值65533,创建成功,说明行最大值为65535 */
    mysql> create table test_varchar_length(v varchar(65533) not null); 
    Query OK, 0 rows affected (0.02 sec)
    
    /** 查看默认字符集,确认是latin1,每个字符只占用1个字节 */
    mysql> show create table test_varchar_length;
    +----------------------+------------------------------------------------------------------------------------------------------------+
    | Table                | Create Table                                                                                               |
    +----------------------+------------------------------------------------------------------------------------------------------------+
    | test_varchar_length | CREATE TABLE `test_varchar_length` (
      `v` varchar(65533) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +----------------------+------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    可空列标识位

    COMPACTDYNAMIC行格式下,行大小除了数据列长度,还包括可空列标识,即NULL标识位。

    • 如果有一个列允许为空,则需要1 bit来标识,每8 bits的标识会组成一个字段,该字段会存放在每行最开始的位置

      注意,这个标识位不是放在每列,而是每行共享。

    • 假设一张表中存在N个可空字段,NULL标识位需要 ⌈ N / 8 ⌉ \lceil{N/8}\rceil N/8 (向上取整)个字节。此时整行可用于数据存储的空间只有 65535 − ⌈ N / 8 ⌉ 65535 - \lceil{N/8}\rceil 65535N/8个字节。

    Talk is cheep,一起来验证下:
    在行大小的例子中,我们知道最大可创建65533字节长度的非空VARCHAR列。现在要创建一个可空列,每行需要1 bitNULL标识位、MySQL会将其组装成1 byte的字段存放,那么我们应该可创建最大为65533(最大非空VARCHAR列) - 1(NULL标识列)= 65532字节的可空VARCHAR列:

    /** 删除前面创建的表 */
    mysql> drop table test_varchar_length;
    Query OK, 0 rows affected (0.01 sec)
    
    /** 测试边界值65533,确认仍然过大;注意这里使用默认字符集latin1、单字节字符集 */
    mysql> create table test_varchar_length(v varchar(65533));
    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
    
    /** 测试边界值65532,创建成功,说明可空标识列确实占去了1字节;注意这里使用默认字符集latin1、单字节字符集 */
    mysql> create table test_varchar_length(v varchar(65532));
    Query OK, 0 rows affected (0.03 sec)
    

    计算VARCHAR的最大长度,可空标识位是最容易忽略的。

    字符集的单字符最大字节数

    字符集单字符最大字节数不难理解,列举MySQL常见的三个字符集:

    • GBK:单字符最大可占用2个字节。
    • UTF8:单字符最大可占用3个字节。
    • UTF8MB4:单字符最大占4个字节。
      假设还有6字节可以存放字符,按单字符占用最大字节数来算,可以存放3个GBK、2个UTF8、1个UTF8MB4

    VARCHAR的长度标识位

    长度标识位是相对比较复杂的,网上的介绍错的很多,也容易算错。

    其作用是记录数据的字节数

    存储开销是小于255只要1字节、大于255后使用两字节。是因为按照可能的数据大小,分为0 - 255(28)、256 - 65535(216),刚好对应1字节和2字节。

    但要注意,其计算根据的是字段声明的字符长度、计算可能的字节数,再决定长度标志的字节数。如VARCHAR(100),字符集为UTF8,可能的字节数为300,长度标识则为2字节。这是网上介绍错的最多的。

    另外长度标志位是底层存储开销,不占用字段声明的字符长度。声明的字符长度的是数据的字符数,数据的字节数与字符集有关。

    VARCHAR(1)为例,可以存1个字符,MySQL会额外找一个字节存放长度标识


    样例

    公式应该都理解了:VARCHAR的最大长度 = (最大行大小 - NULL标识列占用字节数 - 长度标识字节数) / 字符集单字符最大字节数。有余数时向下取整。

    接下来通过实验来验证。为了便于理解计算,例子做了一些调整:

    • 不设置可空列、这样可以去掉NULL标识列
    • 为了便于体现长度标识位的差距,采用多个列的形式放大其存在
    • 为了体现按可能字节数计算长度,这里采用多字节的字符集GBK

    创建一个表,包含2个非空VARCHAR(127),每个列存储开销为127*2(可能的最大字节数, GBK字符占2字节)+长度标识位1=255字节:

    • 剩余空间为65535 - 255*2 = 65025字节
    • 剩余空间可存放一个VARCHAR(32511) NOT NULL列(32511*2(GBK字符占2字节)+2(长度标识位占2字节)=65024
    mysql> drop table test_varchar_length;
    Query OK, 0 rows affected (0.01 sec)
    /** 测试边界值32512,确认仍然过大 */
    mysql> create table test_varchar_length(v1 varchar(127) not null,v2 varchar(127) not null,vm varchar(32512) not null) 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
    
    /** 测试边界值32511,创建成功,说明两个长度标识位共占去了2字节 */
    mysql> create table test_varchar_length(v1 varchar(127) not null,v2 varchar(127) not null,vm varchar(32511) not null) CHARSET=GBK; 
    Query OK, 0 rows affected (0.02 sec)
    

    接下来将两个字段调大到128字符,每个列的存储为最大字节数256+长度标识位2=258字节

    • 剩余空间65535 - 258*2 = 65019字节
    • 剩余空间可存放一个VARCHAR(32508) NOT NULL列(32508*2(GBK字符占2字节)+2(长度标识位占2字节)=65018):
    mysql> drop table test_varchar_length;
    Query OK, 0 rows affected (0.01 sec)
    /** 测试边界值32509,确认仍然过大 */
    mysql> create table test_varchar_length(v1 varchar(128) not null,v2 varchar(128) not null,vm varchar(32509) not null) 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
    
    /** 测试边界值32508,创建成功,说明两个长度标识位共占去了4字节 */
    mysql> create table test_varchar_length(v1 varchar(128) not null,v2 varchar(128) not null,vm varchar(32508) not null) CHARSET=GBK; 
    Query OK, 0 rows affected (0.02 sec)
    



    恭喜你,能看到这里的人估计不多,坚持下来的你已经得到了提升。
    在这里插入图片描述

    那么再一起解下最初的问题:

    • UTF8MB4字符中,中文字符需要3个字节(大部分中文只需要3字节,4字节主要是emoji等辅助平面字符),那么“中国cn”需要3+3+1+18个字节
    • VARCHAR(64) CHARSET utf8mb4字段,数据最大可能的字节数是64*4=256,所以需要 2个字节 作为长度标识位;
    • 该字段是可以为空的,那么还需要NULL标识位,MySQL会生成一个 1字节NULL标识列来记录;
    • 所以要存储“中国cn”,列需要8 + 2个字节,还需要1字节作为NULL标识列;因为该列是多个列共享的,如果该表只有一个字段,那么可以存储开销应该是11个字节,否则只能算作10.125字节(1/8等于0.125

    所以答案是10.12511字节。

    😂哈哈哈我花了4个小时,占用了你10分钟,但你不用像我这么掉头发啦!摸着秀发给我点个赞吧~~

    同类文章推荐:


    以上,感谢您的阅读。

    后续更新收集中:

    • 行格式解析
    • 其他引擎表现
    展开全文
  • 细说varchar与char有哪些区别?

    千次阅读 多人点赞 2020-10-30 13:45:23
    CHAR和VARCHAR是MySQL中两种最重要的字符串类型,两者的原理和区别也是面试中高频问题,如果是你,会从哪几个角度去回答这个问题呢?今天,我给大家总结了一下相关知识点,让我们一起回顾一下吧。 ----- 本文描述和...

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录

      CHAR和VARCHAR是MySQL中两种最重要的字符串类型,两者的原理和区别也是面试中高频问题,如果是你,会从哪几个角度去回答这个问题呢?今天,我给大家总结了一下相关知识点,让我们一起回顾一下吧。 ----- 本文描述和假设使用的存储引擎以Innodb和MyISAM为准

    一、CHAR和VARCHAR有哪些区别

    1、固定长度 & 可变长度

    • VARCHAR

      VARCHAR类型用于存储可变长度字符串,是最常见的字符串数据类型。它比固定长度类型更节省空间,因为它仅使用必要的空间(根据实际字符串的长度改变存储空间)。
      有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储。

    • CHAR

      CHAR类型用于存储固定长度字符串:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除字符串中的末尾空格(在MySQL 4.1和更老版本中VARCHAR 也是这样实现的——也就是说这些版本中CHAR和VARCHAR在逻辑上是一样的,区别只是在存储格式上)。
      同时,CHAR值会根据需要采用空格进行剩余空间填充,以方便比较和检索。但正因为其长度固定,所以会占据多余的空间,也是一种空间换时间的策略;

    2、存储方式

    • VARCHAR

      VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集,一个VARCHAR(10)的列需要11个字节的存储空间。VARCHAR(1000)的列则需要1002 个字节,因为需要2个字节存储长度信息。

      VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MylSAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。

    • CHAR

      CHAR适合存储很短或长度近似的字符串。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。

    3、存储容量

    • CHAR

      对于char类型来说,最多只能存放的字符个数为255,和编码无关,任何编码最大容量都是255。

    • VARCHAR

      MySQL默认最大65535字节,是所有列共享(相加)的,所以VARCHAR的最大值受此限制。

      表中只有单列字段情况下,varchar一般最多能存放(65535 - 3)个字节,varchar的最大有效长度通过最大行数据长度使用的字符集来确定,通常的最大长度是65532个字符(当字符串中的字符都只占1个字节时,能达到65532个字符)

    为什么是65532个字符?算法如下(有余数时向下取整):

    最大长度(字符数) = (行存储最大字节数 - NULL标识列占用字节数 - 长度标识字节数) / 字符集单字符最大字节数

    • NULL标识列占用字节数:允许NULL时,占一字节
    • 长度标识字节数:记录长度的标识,长度小于等于255(28)时,占1字节;小于65535时(216),占2字节

    VARCHAR类型在4.1和5.0版本发生了很大的变化,使得情况更加复杂。从MySQL 4.1开始,每个字符串列可以定义自己的字符集和排序规则。这些东西会很大程度上影响性能。

    • 4.0版本及以下,MySQL中varchar长度是按字节展示,如varchar(20),指的是20字节
    • 5.0版本及以上,MySQL中varchar长度是按字符展示。如varchar(20),指的是20字符

    当然,总长度还是65535字节,而字符和字节的换算,则与编码方式有关,不同的字符所占的字节是不同的。编码划分如下:

    GBK编码:
    一个英文字符占一个字节,中文2字节,单字符最大可占用2个字节。

    UTF-8编码:
    一个英文字符占一个字节,中文3字节,单字符最大可占用3个字节。

    utf8mb4编码:
    一个英文字符占一个字节,中文3字节,单字符最大占4个字节(如emoji表情4字节)。

      假设当前还有6字节可以存放字符,按单字符占用最大字节数来算,可以存放3个GBK、或2个utf8、或1个utf8mb4。


    思考:既然VARCHAR长度可变,那我要不要定到最大?

      没错,相信你已经有答案了,别这么干!

      就像使用VARCHAR(5)和VARCHAR(200)存储 '陈哈哈’的磁盘空间开销是一样的。那么使用更短的列有什么优势呢?

      事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。

      当然,在没拿到存储引擎存储的数据之前,并不会知道我这一行拿出来的数据到底有多长,可能长度只有1,可能长度是500,那怎么办呢?那就只能先把最大空间分配好了,避免放不下的问题发生,这样实际上对于真实数据较短的varchar确实会造成空间的浪费。
      举例:我向数据类型为:varchar(1000)的列插入了1024行数据,但是每个只存一个字符,那么这1024行真实数据量其实只有1K,但是我却需要约1M的内存去适应他。所以最好的策略是只分配真正需要的空间。


    二、CHAR和VARCHAR在SQL中需要注意的点

      下面通过一个具体的示例来说明CHAR和VARCHAR类型存储时的区别。我们创建一张同时存在CHAR(10)字段、VARCHAR(10)字段的表,并且往里面插入一些值来做对比验证:

    -- 建表语句
    CREATE TABLE `str_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `str_char` char(10) DEFAULT NULL,
      `str_varchar` varchar(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
    

    分别插入一些字符串前面和后面都有空格的示例

    -- 插入测试数据
    INSERT INTO `str_table` (`id`, `str_char`, `str_varchar`) 
    VALUES 
    (null, '陈哈哈', '陈哈哈'),
    (null, '  陈哈哈', '  陈哈哈'),
    (null, '陈哈哈  ', '陈哈哈  ');
    

    测试数据查询语句如下,通过拼接能更好的看出对比效果:

    -- 测试数据查询
    select id,concat("|",str_char,"|") as `char`,concat("|",str_varchar,"|") as `varchar` from str_table;
    
    mysql> select id,concat("|",str_char,"|") as `char`,concat("|",str_varchar,"|") as `varchar` from str_table;
    +----+---------------+---------------+
    | id | char          | varchar       |
    +----+---------------+---------------+
    |  6 | |陈哈哈|      | |陈哈哈|      |
    |  7 | |  陈哈哈|    | |  陈哈哈|    |
    |  8 | |陈哈哈|      | |陈哈哈  |    |
    +----+---------------+---------------+
    3 rows in set (0.00 sec)
    
    • 当检索这些值的时候,会发现id=8行中,char类型的"陈哈哈 "末尾的空格被截断了,而VARCHAR(10)字段存储相同的值时,末尾的空格被保留了。
    • 另外,id=7行的数据前面空格都被保留了。

    可见,CHAR会默认切掉字符串末尾的空格,如果需要保留末尾的空格,记得用varchar类型!


    三、类似的二进制类型:VARBINARY

      与CHAR和VARCHAR类似的类型还有BINARY和VARBINARY,它们存储的是二进制字符串。二进制字符串跟常规字符串非常相似,但是二进制字符串存储的是字节码而不是字符。 填充也不一样:MySQL填充BINARY采用的是\0 (零字节)而不是空格,在检索时也不会去掉填充值。

      当需要存储二进制数据,并且希望MySQL使用字节码而不是字符进行比较时,这些类型是非常有用的。二进制比较的优势并不仅仅体现在大小写敏感上。MySQL比较BINARY字符串时,每次按一个字节,并且根据该字节的数值进行比较。因此,二进制比 较比字符比较简单很多,所以也就更快。

    • varchar

      varchar是可变长度字符类型,如果对应的数据库排序规则是utf8_general_ci,那么查询的时候将不区分大小写。如果排序规则是utf8_bin,则会区分大小写。

    • varbinary

      varbinary是二进制字符类型,在排序规则utf8_general_ci下,是可以区分大小写的。

    附、一张有故事的照片(八)

    在这里插入图片描述

    一场山火过后
    一只雌山鸡体无完肤的躺在自己的窝巢旁
    巢里是已经烧熟了的蛋
    直到最后一刻
    她也没有离开自己的孩子

    展开全文
  • MySQL数据类型varchar详解

    千次阅读 2021-01-18 19:33:37
    MySQL数据类型varchar详解更新时间:2014年03月17日 11:10:11 作者:这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM中的varchar等问题,需要的朋友可以参考下1、varchar(N)...

    MySQL数据类型varchar详解

    更新时间:2014年03月17日 11:10:11   作者:

    这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM中的varchar等问题,需要的朋友可以参考下

    1、varchar(N)的逻辑意义从MySQL4.1开始,varchar (N)中的N指的是该字段最多能存储多少个字符(characters),不是字节数。

    不管是一个中英文字符或者数字、或者一个汉字,都当做一个字符。在4.1之前,N表示的是最大存储的字节数(bytes)。

    2、varchar(N)到底能存多长的数据

    在mysql reference manual上,varchar最多能存储65535个字节的数据。varchar 的最大长度受限于最大行长度(max row size,65535bytes)。65535并不是一个很精确的上限,可以继续缩小这个上限。65535个字节包括所有字段的长度,变长字段的长度标识(每个变长字段额外使用1或者2个字节记录实际数据长度)、NULL标识位的累计。

    NULL标识位,如果varchar字段定义中带有default null允许列空,则需要需要1bit来标识,每8个bits的标识组成一个字段。一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位。

    如果数据表只有一个varchar字段且该字段DEFAULT NULL,那么该varchar字段的最大长度为65532个字节,即65535-2-1=65532 bytes。

    CREATE TABLE `vchar1` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE `vchar2` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    如果数据表只有一个varchar字段且该字段NOT NULL,那么该varchar字段的最大长度为65533个字节,即65535-2=65533bytes。

    CREATE TABLE `vchar3` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE `vchar4` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    来个略微复杂点的表结构,->

    CREATE TABLE `tv` (

    `a` VARCHAR(100) DEFAULT NULL,

    `b` VARCHAR(100) DEFAULT NULL,

    `c` VARCHAR(100) DEFAULT NULL,

    `d` VARCHAR(100) DEFAULT NULL,

    `e` VARCHAR(100) DEFAULT NULL,

    `f` VARCHAR(100) DEFAULT NULL,

    `g` VARCHAR(100) DEFAULT NULL,

    `h` VARCHAR(100) DEFAULT NULL,

    `i` VARCHAR(N) DEFAULT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    `i` varchar(N) DEFAULT NULL中N最大值可以为多少?

    这样计算:已知确定的字段长度为100*8  bytes,8个varchar(100)字段总共需要变长字段表示字节为1*8=8 bytes。每个NULL字段用1bit标识,9个字段都是default null,那么需要用(9+7)/8bit = 2 bytes存储NULL标识位。65535-100*8-1*8-2 = 64725 > 256, 那么字段i的最大长度为64725  - 2 =64723 bytes,即N=64723 。

    varchar到底能存多少个字符?这与使用的字符集相关,latin1、gbk、utf8编码存放一个字符分别需要占1、2、3个字节。

    3、varchar物理存储

    在物理存储上,varchar使用1到2个额外的字节表示实际存储的字符串长度(bytes)。如果列的最大长度小于256个字节,用一个字节表示(标识)。如果最大长度大于等于256,使用两个字节。

    当选择的字符集为latin1,一个字符占用一个byte

    varchar(255)存储一个字符,一共使用2个bytes物理空间存储数据实际数据长度和数据值。

    varchar(256)存储一个字符,使用2 bytes表示实际数据长度,一共需要3 bytes物理存储空间。

    varchar对于不同的RDBMS引擎,有不通的物理存储方式,虽然有统一的逻辑意义。对于mysql的不同存储引擎,其实现方法与数据的物理存放方式也不同。

    4、InnoDB中的varchar

    InnoDB中varchar的物理存储方式与InnoDB使用的innodb_file_format有关。早期的innodb_file_forma使用的Antelope文件格式,支持redundant和compact两种row_format。从5.5开始或者InnoDB1.1,可以使用一种新的file format,Barracuda。Barracuda兼容Redundant,另外还支持dynamic和compressed两种row_format.

    当innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或者COMPACT。

    innodb的聚集索引(cluster index)仅仅存储varchar、text、blob字段的前768个字节,多余的字节存储在一个独立的overflow page中,这个列也被称作off-page。768个字节前缀后面紧跟着20字节指针,指向overflow pages的位置。

    另外,在innodb_file_format=Antelope情况下,InnoDB中最多能存储10个大字段(需要使用off-page存储)。innodbd的默认page size为16KB,InnoDB单行的长度不能超过16k/2=8k个字节,(768+20)*10 < 8k。

    当innodb_file_format=Barracuda, ROW_FORMAT=DYNAMIC 或者 COMPRESSED

    innodb中所有的varchar、text、blob字段数据是否完全off-page存储,根据该字段的长度和整行的总长度而定。对off-page存储的列,cluster index中仅仅存储20字节的指针,指向实际的overflow page存储位置。如果单行的长度太大而不能完全适配cluster index page,innodb将会选择最长的列作为off-page存储,直到行的长度能够适配cluster index page。

    5、MyISAM中的varchar

    对于MyISAM引擎,varchar字段所有数据存储在数据行内(in-line)。myisam表的row_format也影响到varchar的物理存储行为。

    MyISAM的row_format可以通过create或者alter sql语句设为fixed和dynamic。另外可以通过myisampack生成row_format=compresse的存储格式。

    当myisam表中不存在text或者blob类型的字段,那么可以把row_format设置为fixed(也可以为dynamic),否则只能为dynamic。

    当表中存在varchar字段的时候,row_format可以设定为fixed或者dynamic。使用row_format=fixed存储varchar字段数据,浪费存储空间,varchar此时会定长存储。row_format为fixed和dynamic,varchar的物理实现方式也不同(可以查看源代码文件field.h和field.cc),因而myisam的row_format在fixed和dynamic之间发生转换的时候,varchar字段的物理存储方式也将会发生变化。

    相关文章

    1a1b05c64693fbf380aa1344a7812747.png

    这篇文章主要介绍了Suse Linux 10中MySql安装与配置步骤,本文详细的讲解了安装步骤,需要的朋友可以参考下2015-05-05

    4f55910a645b073bc4fc65dc10dc14bd.png

    这篇文章主要介绍了 linux下安装mysql简单的方法,需要的朋友可以参考下2017-08-08

    0ea3c7666119d5615e582f823fb3fad6.png

    有时候我们需要远程连接mysql数据库,就需要注意下面的问题,方便大家解决,脚本之家小编特为大家准备了一些资料2012-07-07

    4f96a78db829b1556ff16de21e013c7a.png

    这篇文章主要为大家详细介绍了win2008下mysql8.0.11升级mysql8.0.17版本详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-08-08

    8cc1031babc6aff2319f1c6af8544aa0.png

    这篇文章主要介绍了mysql双向加密解密方式用法,需要的朋友可以参考下2014-04-04

    0c932a99bb7b6f23c937db507070cc7b.png

    这篇文章主要为大家详细介绍了Centos7下mysql 8.0.15 安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-03-03

    cca732bf65a93ed2ec0ac80c638460fe.png

    这篇文章主要介绍了MySQL为什么要避免大事务以及大事务解决的方法,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下2020-08-08

    2d9f31f2af7b675a3d153d2b7f1035a7.png

    这篇文章主要介绍了mysql5.6.21安装与配置的详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03

    b452cee8ec5cd9e58ab98eba17281e59.png

    这篇文章主要介绍了Innodb存储引擎索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04

    f4838ec7e2d4da28e0b57d4e852dadd4.png

    这篇文章主要介绍了mysql如何利用Navicat导出和导入数据库的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-02-02

    最新评论

    展开全文
  • SQL varchar数据类型深入探讨

    千次阅读 2020-07-26 08:33:42
    In this article we’ll review the SQL varchar data type including a basic definition and overview, differences from varchar(n), UTF-8 support, Collation, performance considerations and more. ...
  • I have seen that SQL developers use varchar(max) data while designing the tables or temporary tables. We might not be sure about the data length, or we want to eliminate the string or binary trunc...
  • oracle char,varchar,varchar2的区别和使用方法 非本人总结,但是说的挺好的! 欢迎下载
  • mysql的varchar与text对比

    千次阅读 2021-01-18 20:24:10
    大小对比VARCHAR:varchar在mysql中必须满足最大行宽度限制,也就是 65535(64k)字节,而varchar本身是按字符串个数来定义的,在mysql中使用uft-8字符集一个字符占用三个字节,所以单表varchar实际占用最大长度如下.1....
  • 最近有几个同学问我varchar和text有啥别吗,这个问题,以前说真的也没太多的整理,以前遇到text在设计中就是尽可能的拆到另一个表中,保持主表尽量的瘦小,可以让innodb bp缓存更多的数据。今天借次机会系统整理一下...
  • varcharvarchar2的区别

    千次阅读 2021-03-11 19:04:29
    varchar是标准sql里面的;varchar2是oracle提供的独有的数据类型。 varchar对于汉字占两个字节,对于数字,英文字符是一个字节,占的内存小;varchar2一般情况下把所有字符都占两字节处理。具体要看数据库使用的...
  • 支持超过4000字节的varchar2类型

    千次阅读 2021-04-14 00:19:12
    Oracle中最常用的字符串类型可能就是varchar2了,但是一直以来,让人吐槽最多的,可能就是他的存储容量,12c之前,允许存储4000字节,请注意这的单位是字节,如果你按照非常规的字...
  • MySQL varchar有最大长度限制吗

    千次阅读 2021-03-14 00:00:14
    来自公众号:谭小谭先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。在早期低版本中代表的是字节,具体哪个...
  • mysql> CREATE TABLE t6 ( id int, a VARCHAR(100) DEFAULT NULL, b VARCHAR(100) DEFAULT NULL, c VARCHAR(100) DEFAULT NULL, d VARCHAR(100) DEFAULT NULL, e VARCHAR(100) DEFAULT NULL, f VARCHAR(100) DEFAULT...
  • MySQL varchar(255) 和 varchar(256) 区别

    千次阅读 2022-04-07 13:52:12
    原文地址: MySQL varchar(255) 和 varchar(256) 区别 正文 每次给表创建字段的时候, 遇到 VARCHAR 都会想到这个问题, 但是没有深入思考. 在这篇博客中详细学习了一下: 数据库 varchar 长度最佳实践 VARCHAR(256) 会...
  • oracle中varchar2(byte)和varchar2(char) 细节决定成败,大家在设计数据库建表的时候一定要注意。
  • MySQL中varchar最大长度是多少?

    千次阅读 2020-05-07 23:41:03
    MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、...
  • varchar和char 的区别,varchar最大长度

    千次阅读 2019-07-04 15:39:43
    varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),...
  • Mysql varchar长度问题

    千次阅读 2021-01-19 07:16:20
    如果某一项中设置的是varchar(50)那么对英文当然是50那么对中文呢utf-8的中文占3个字节那么,这个varchar(50)是不是只能存16个汉字了?不是这样的,mysql低版本之前是这样的,但是5.0以后就不是了mysql varchar(50) ...
  • MySQL关于varchar长度设置

    千次阅读 2021-11-06 16:55:07
    文章目录1、MySQL的字段类型1.1、数值类型1.4、文本类型1.5、二进制数据类型1.6、日期类型2、varchar长度设置2.1、结论2.2、varchar(n)的最大值字符数2.3、varchar(n)需要1-2个额外字节记录长度n的值2.3.1 关于内存...
  • MySQL的varchar长度问题

    万次阅读 2019-09-11 17:21:35
    在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用...
  • varcharvarchar2区别

    千次阅读 2020-06-24 10:17:29
    在比赛数据中看到某两列数据类型为varchar2类型,查阅资料做下记录。 varchar varchar为标准sql:VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。其中M...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 926,469
精华内容 370,587
关键字:

varchar

友情链接: 预处理.rar