精华内容
下载资源
问答
  • Range分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段. 基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。varchar日期字段分区sql demo
  • 在本文里我们给大家分享了关于mysql varchar类型求和实例操作以及相关知识点,需要的朋友们学习参考下。
  • 今天群里有人问varchar 不是最大应该只可以设置65532(第一个字节+两个长度字节)吗 ,但是为什么可以设置成65533
  • NULL 博文链接:https://wy649898543.iteye.com/blog/1446712
  • 主要介绍了MySQL中把varchar类型转为date类型方法详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 主要介绍了Mysql数据库中把varchar类型转化为int类型的方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 细说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下,是可以区分大小写的。

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

    在这里插入图片描述

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

    展开全文
  • 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. ...

    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.

    在本文中,我们将介绍SQL varchar数据类型,包括基本定义和概述,与varchar(n)的区别,UTF-8支持,排序规则,性能注意事项等。

    Data plays a crucial part in any organization and an attribute by which it is defined is called its data type. In simple words, data type states what kind of data any object, variable or expression can store. As a SQL developer, while creating a SQL table, we have to understand and decide what type of data will be contained by each and every column in a table. Like any other programming language, SQL also supports a gamut of data types that can hold integer data, date and time data, character data etc. and allows you to define data types of your own as well. SQL varchar is one of the best-known and most-used data types among the lot. In this article, we will walk through different facets of the SQL Server varchar in the SQL server.

    数据在任何组织中都起着至关重要的作用,定义它的属性称为数据类型。 简而言之,数据类型说明任何对象,变量或表达式可以存储哪种数据。 作为SQL开发人员,在创建SQL表时,我们必须了解并确定表中的每一列将包含哪种数据类型。 与任何其他编程语言一样,SQL还支持多种数据类型,这些数据类型可以容纳整数数据,日期和时间数据,字符数据等,还允许您定义自己的数据类型。 SQL varchar是其中最著名和最常用的数据类型之一。 在本文中,我们将遍历SQL Server中SQL Server varchar的不同方面。

    Below is the outline that we will cover in this block.

    以下是我们将在本节中介绍的概述。

    1. Introduction to the SQL Server varchar data type in SQL Server

      SQL Server中SQL Server varchar数据类型简介
    2. Use of varchar for large blocks of text

      将varchar用于大块文本
    3. What is new in SQL Server 2019 preview for varchar datatype?

      SQL Server 2019预览版中varchar数据类型的新增功能是什么?
    4. Influence of collation on varchar SQL in SQL Server

      排序规则对SQL Server中的varchar SQL的影响
    5. UTF-8 support with varchar in SQL Server 2019 CTP

      SQL Server 2019 CTP中的varchar支持UTF-8
    6. SQL Server varchar for data conversions and data display

      SQL Server varchar用于数据转换和数据显示
    7. Storage and performance considerations using SQL Server varchar

      使用SQL Server varchar的存储和性能注意事项
    8. Impact on string length of SQL varchar with CAST and CONVERT functions

      使用CAST和CONVERT函数对SQL varchar的字符串长度的影响

    Let’s move ahead and see the aforementioned in action.

    让我们继续前进,看看前面的内容。

    那么,SQL中的varchar是什么? (So what is varchar in SQL?)

    As the name suggests, varchar means character data that is varying. Also known as Variable Character, it is an indeterminate length string data type. It can hold numbers, letters and special characters. Microsoft SQL Server 2008 (and above) can store up to 8000 characters as the maximum length of the string using varchar data type. SQL varchar usually holds 1 byte per character and 2 more bytes for the length information. It is recommended to use varchar as the data type when columns have variable length and the actual data is way less than the given capacity. Let’s switch to SSMS and see how varchar works.

    顾名思义,varchar表示变化的字符数据。 也称为可变字符,它是长度不确定的字符串数据类型。 它可以容纳数字,字母和特殊字符。 Microsoft SQL Server 2008(及更高版本)可以使用varchar数据类型存储最多8000个字符,作为字符串的最大长度。 SQL varchar通常每个字符包含1个字节,而长度信息则另外包含2个字节。 当列的长度可变并且实际数据小于给定容量时,建议使用varchar作为数据类型。 让我们切换到SSMS,看看varchar是如何工作的。

    The following example creates three variables (name, gender and age) with varchar as the data type and different values being assigned to them. As evident from the result sets shown below, by default, the string length of the SQL varchar columns is 1 and it returns only the first value of the variables(rest of the string being truncated) when no string length is passed for the varchar data type. Function len() is used to determine the number of characters stored in the varchar column.

    下面的示例创建三个变量(名称,性别和年龄),并将varchar作为数据类型,并为其分配不同的值。 从下面显示的结果集中可以明显看出,默认情况下,SQL varchar列的字符串长度为1,并且在不为varchar数据传递任何字符串长度的情况下,它仅返回变量的第一个值(字符串的其余部分被截断)类型。 函数len()用于确定varchar列中存储的字符数。

    DECLARE @name AS varchar = 'john parker d''souza';  
    DECLARE @gender AS varchar = 'M'
    DECLARE @age AS varchar = '23'
     
    SELECT @name Name, @gender Gender ,@age Age
    SELECT len(@name) namelen, len(@gender) genderlen, len(@age) agelen
    

    Default values and length of SQL varchar variables in SSMS.

    SQL varchar(max)与varchar(n)有何不同? (How SQL varchar(max) is different from varchar(n)?)

    There are times where SQL developers (including myself) usually define varchar datatype without a length, and subsequently, are failed to insert string records in the SQL table, this is because SQL Server allocates 1 character space as the default value to the varchar column that is defined without any length. In practical scenarios, varchar(n) is used to store variable length value as a string, here ‘n’ denotes the string length in bytes and it can go up to 8000 characters. Now, let’s proceed further and see how we can store SQL varchar data with a string length into the column of a SQL table. Below script creates the table Demovarchar with some data in it. And the result screen shows records of 7 employees based on their departments, age etc.

    有时候,SQL开发人员(包括我自己)通常定义不带长度的varchar数据类型,并且随后无法在SQL表中插入字符串记录,这是因为SQL Server将1个字符空间作为默认值分配给varchar列,定义没有任何长度。 在实际情况下,varchar(n)用于将可变长度值存储为字符串,这里的“ n”表示字符串长度(以字节为单位),最多可以包含8000个字符。 现在,让我们继续进行下去,看看如何将具有字符串长度SQL varchar数据存储到SQL表的列中。 下面的脚本创建表Demovarchar,其中包含一些数据。 结果屏幕显示了7名员工的记录,这些记录是基于他们的部门,年龄等而得出的。

    CREATE TABLE Demovarchar
    (
    Id int NOT NULL IDENTITY(1,1),
    LastName varchar(10),
    FirstName varchar(10),
    Gender varchar,
    DepartmentName varchar(20),
    Age int
    )
    INSERT INTO Demovarchar VALUES('Gilbert', 'Kevin','M','Tool Design',33)
    INSERT INTO Demovarchar VALUES('Tamburello', 'Andrea','F','Marketing',45)
    INSERT INTO Demovarchar VALUES('Johnson', 'David','M','Engineering',66)
    INSERT INTO Demovarchar VALUES('Sharma', 'Bradley','M','Production',27)
    INSERT INTO Demovarchar VALUES('Rapier', 'Abigail','F',	'Human Resources',38)
    INSERT INTO Demovarchar VALUES('Martin', 'Kelly','F','Information Services',54)
    INSERT INTO Demovarchar VALUES('Poland', 'Carole','F','Production Control',29)
    SELECT * FROM Demovarchar
    

    Demo table created to contain SQL Server varchar data in SSMS.

    Suppose, there is a new addition of an employee in the organization and we, as SQL data developers, would have to insert this new record into the above table using INSERT SQL Statement. Below is one such example shown.

    假设组织中有一个新员工,作为SQL数据开发人员,我们将不得不使用INSERT SQL Statement将这个新记录插入到上表中。 下面是一个这样的例子。

    INSERT INTO Demovarchar VALUES('Newton Hamilton', 'Isaac','M','Design Head',69)
    

    Error encountered while inserting a new record with string length greater than the assigned length of varchar column.

    Oops, SQL Server encountered an error and terminated the statement saying string or binary data would be truncated. This has occurred because, column LastName varchar(10) can hold up to 10 characters and here we are attempting to insert a new record with string length(‘Newton Hamilton’) which is clearly greater than 10 characters. As a quick fix, we can alter the table and increase the data type of the SQL varchar column, say to varchar(50) to insert the new row. Execute the below script to ALTER and INSERT a new record into the table. Additionally, you can use LEN() and DATALENGTH() functions to determine the number of characters and the storage size in bytes respectively that are stored in the varchar column.

    糟糕,SQL Server遇到错误,并终止了声明字符串或二进制数据将被截断的语句。 发生这种情况的原因是,LastName varchar(10)列最多可容纳10个字符,并且在此我们尝试插入一个字符串长度('Newton Hamilton')明显大于10个字符的新记录。 作为快速解决方案,我们可以更改表并增加SQL varchar列的数据类型,对varchar(50)说,以插入新行。 执行以下脚本以ALTER并将新记录插入表中。 此外,您可以使用LEN()和DATALENGTH()函数来确定分别存储在varchar列中的字符数和以字节为单位的存储大小。

    ALTER TABLE Demovarchar 
    ALTER COLUMN LastName varchar(50) 
    INSERT INTO Demovarchar VALUES('Newton Hamilton', 'Isaac','M','Design Head',69)
    SELECT * FROM Demovarchar
    

    Succesfully inserted new record by changing varchar(10) data type to varchar(50) data type.

    We observed above how we can set or alter the string length in the SQL varchar column to meet the business needs. However, consider a scenario, where we are unsure of the data size that is going to be loaded into our SQL tables, in such circumstances, inspecting and altering data type size for each and every column is not a viable choice. One of the options to handle this could be is to set the string length on the higher bar in the SQL Server varchar column (provided you have a rough estimation of what length of the string column would be approximately).

    上面我们观察了如何在SQL varchar列中设置或更改字符串长度以满足业务需求。 但是,请考虑以下情况:我们不确定要加载到SQL表中的数据大小,在这种情况下,检查和更改每一列的数据类型大小并不是一个可行的选择。 解决此问题的一种方法是在SQL Server varchar列的较高栏中设置字符串长度(前提是您对字符串列的长度大约是粗略的估计)。

    An important point to keep in consideration, we can use string length up to varchar(8000) only as this is the maximum number of characters that SQL varchar(n) data type can hold. So in cases when there are chances that the string length of the varchar column might exceed 8000 bytes, using varchar(8001) or anything higher will result into an error. One short example demonstrating this fact is shown below.

    需要考虑的重要一点,我们只能使用不超过varchar(8000)的字符串长度,因为这是SQL varchar(n)数据类型可以容纳的最大字符数。 因此,在varchar列的字符串长度可能超过8000个字节的情况下,使用varchar(8001)或更高的值将导致错误。 一个简短的例子证明了这一事实,如下所示。

    DECLARE @name AS varchar(8001) = 'john parker d''souza';  
    SELECT @name Name
    

    Displays error when exceeding the limit of varchar(8000) datatype to anything more than 8000.

    SQL Server 2005 got around this limitation of 8KB storage size and provided a workaround with varchar(max). It is a non-Unicode large variable-length character data type and can store a maximum of 2^31-1 bytes (2 GB) of non-Unicode characters.

    SQL Server 2005克服了8KB存储大小的限制,并提供了varchar(max)解决方法。 它是非Unicode大变长字符数据类型,最多可以存储2 ^ 31-1字节(2 GB)的非Unicode字符。

    When I got first introduced to the concepts of varchar(n) and SQL varchar, the common question like any other beginner I had, was why can’t we simply declare a column of data type varchar(8500) or higher, since we have varchar(max) that takes care of storage up to 2GB and why are we supposed to either use varchar(<=8000) or varchar(max)? I got my answers on a little research that SQL Server uses page to store data and the size of each page is 8KB(excluding page header, row offsets size). If the data to be stored is less than or equal to 8000 bytes, varchar(n) or varchar(max) stores it in-row. However, if the data exceeds the 8000 byte size then it is treated as a Large Object(LOB) and they are not stored in-row but in separate LOB pages(LOB_DATA). Row in such case will only have a pointer to the LOB data page where the actual data is present and SQL Server automatically assigns an over-flow indicator to the page to manipulate data rows. In nutshell, if you know the data might exceed 8000 byte, it is a better option to use varchar(max) as the data type.

    当我第一次介绍varchar(n)和SQL varchar的概念时,像我遇到的其他任何初学者一样,常见的问题是为什么我们不能简单地声明数据类型为varchar(8500)或更高的列,因为varchar(max)最多可处理2GB的存储,为什么我们应该使用varchar(<= 8000)或varchar(max)? 我得到了有关SQL Server使用页面存储数据并且每个页面的大小为8KB(不包括页眉,行偏移量大小)的一些研究的答案。 如果要存储的数据小于或等于8000个字节,则varchar(n)或varchar(max)会将其存储在行中。 但是,如果数据超过8000字节大小,则将其视为大对象(LOB),它们不会存储在行中,而是存储在单独的LOB页(LOB_DATA)中。 在这种情况下,行将仅具有一个指向实际数据存在的LOB数据页的指针,并且SQL Server自动向该页分配一个溢出指示器以操纵数据行。 简而言之,如果您知道数据可能超过8000个字节,则最好使用varchar(max)作为数据类型。

    We can refer to the DMV sys.dm_db_index_physical_stats to see what kind of page allocation (IN_ROW_DATA data/LOB_DATA/ ROW_OVERFLOW_DATA) is performed. You can also check out this link in case you want detailed explanation on how SQL Server exercises row and page limits with both varchar(n) and varchar(max) data types.

    我们可以参考DMV sys.dm_db_index_physical_stats来查看执行哪种页面分配(IN_ROW_DATA数据/ LOB_DATA / ROW_OVERFLOW_DATA)。 如果需要有关SQL Server如何使用varchar(n)和varchar(max)数据类型行使行和页限制的详细说明,也可以查看此链接

    Let’s quickly jump over to SSMS and see how we can use varchar(max). Execute the following script to insert 1 record where StringCol column value in each row is 15,000 B characters (i.e. 15,000 bytes).

    让我们快速跳转到SSMS,看看如何使用varchar(max)。 执行以下脚本以插入1条记录,其中每行的StringCol列值是15,000个B字符(即15,000个字节)。

    CREATE TABLE Demovarcharmax
        (
          ID INT IDENTITY(1, 1) ,
          StringCol VARCHAR(MAX)
        )
    INSERT  INTO Demovarcharmax(StringCol) VALUES(REPLICATE(CAST('B' AS VARCHAR(MAX)), 15000))
    SELECT Id, StringCol,len(StringCol) AS LengthOfString FROM Demovarcharmax
    

    Using SQL Server varchar feature of varchar(max)  to insert a column with 15,000 bytes value.

    One limitation of using varchar(max) is we cannot create an index that has a varchar(max) as a key column, instead, it is advisable to do a Full-text index on that column.

    使用varchar(max)的一个限制是我们不能创建以varchar(max)作为键列的索引,而是建议在该列上进行全文本索引。

    A quick note to make – From here to the last leg of this article, we will mention varchar in place of varchar(n). Do NOT consider it as the varchar with default value = 1.

    快速说明–从这里到本文的最后一站,我们将用varchar代替varchar(n)。 不要将其视为默认值为1的varchar。

    To learn some more interesting differences between varchar(n) and varchar(max) in SQL Server, consider going through this article, Comparing VARCHAR(max) vs VARCHAR(n) data types in SQL Server.

    要了解SQL Server中varchar(n)和varchar(max)之间一些更有趣的区别,请考虑阅读本文, 比较 SQL Server中的VARCHAR(max)与VARCHAR(n)数据类型

    SQL Server 2019 CTP的UTF-8支持 (UTF-8 support with SQL Server 2019 CTP )

    Before we dig in what SQL Server 2019 preview feature has to offer for SQL varchar, let’s quickly look at one more interesting data type – ‘nvarchar’ first. Like SQL Server varchar [(n|max)], we have SQL nvarchar [(n|max)], the prefix n in nvarchar denotes Unicode, i.e. it stores both Unicode and non-Unicode data. The key difference between varchar and nvarchar is the way they are stored, varchar is stored as regular 8-bit data(1 byte per character) and nvarchar stores data at 2 bytes per character. Due to this reason, nvarchar can hold upto 4000 characters and it takes double the space as SQL varchar. You can go through this link to learn more about nvarchar in SQL Server.

    在我们深入研究SQL varchar提供SQL Server 2019预览功能之前,让我们快速看一下另一个有趣的数据类型-首先是'nvarchar'。 像SQL Server varchar [(n | max)]一样,我们有SQL nvarchar [(n | max)],nvarchar中的前缀n表示Unicode,即它存储Unicode和非Unicode数据。 varchar和nvarchar之间的主要区别在于它们的存储方式,varchar存储为常规8位数据(每个字符1个字节),nvarchar存储数据每个字符2个字节。 由于这个原因,nvarchar最多可以容纳4000个字符,并且占用的空间是SQL varchar的两倍。 您可以通过此链接来了解有关SQL Server中的nvarchar的更多信息。

    With the public preview of SQL Server 2019, Microsoft has announced the support for UTF-8 character encoding to the existing data types (varchar and char). For those, who are not aware of UTF-8, it stands for Unicode Transformation Format and is a Unicode-based encoding that supports many languages. The 8 in UTF-8 means it uses 1 byte (8-bits) to represent a character in memory. Likewise, UTF-16 uses 16 bits (2 bytes) to represent a character. We will limit the scope of this new SQL Server 2019 CTP enhancement to ‘SQL varchar’ only in this article.

    在SQL Server 2019的公开预览中,Microsoft宣布了对现有数据类型(varchar和char)的UTF-8字符编码的支持。 对于那些不知道UTF-8的人,它代表Unicode转换格式,是一种支持多种语言的基于Unicode的编码。 UTF-8中的8表示它使用1个字节(8位)表示内存中的字符。 同样,UTF-16使用16位(2个字节)表示一个字符。 仅在本文中,我们将此新SQL Server 2019 CTP增强功能的范围限制为``SQL varchar''。

    This enhancement has the following impact in SQL Server: is

    此增强功能在SQL Server中具有以下影响:是

    1. Until SQL Server 2019 CTP, SQL varchar data type had the capacity to store only Non-Unicode data and with this preview, we can now create a varchar column to store Unicode data under UTF-8 enabled collations (_UTF8). UTF-8 is allowed in the varchar datatypes and is enabled when creating or changing an object’s collation to a collation with the UTF8 suffix. This helps in minimizing character conversion issues.

      在SQL Server 2019 CTP之前,SQL varchar数据类型只能存储非Unicode数据,并且通过此预览,我们现在可以创建一个varchar列以在启用UTF-8的归类(_UTF8)下存储Unicode数据。 varchar数据类型中允许使用UTF-8,并且在创建对象的归类或将其归类为具有UTF8后缀的归类时启用。 这有助于最大程度地减少字符转换问题。

    2. UTF-8 support for varchar data type provides substantial storage savings depending on the character set in use. For eg, using an UTF-8 enabled collation, changing the column data type from nvarchar(20) to varchar(20) offers a significant drop in storage requirements since nvarchar(20) requires 40 bytes for storage and varchar(20) needs 20 bytes for the same Unicode string.

      根据所使用的字符集,对varchar数据类型的UTF-8支持可节省大量存储空间。 例如,使用启用了UTF-8的排序规则,将列数据类型从nvarchar(20)更改为varchar(20)会大大降低存储要求,因为nvarchar(20)需要40个字节来存储,而varchar(20)需要20个字节同一Unicode字符串的字节数。

    Important side note – Since this enhancement is still in preview, we can expect more progressions on this front in the near future. However, existing Unicode (UTF-16) data types (nchar, nvarchar and ntext) remain unchanged in SQL Server 2019 preview.

    重要的旁注–由于此增强功能仍在预览中,因此我们预计在不久的将来会在这方面取得更多进展。 但是,现有的Unicode(UTF-16)数据类型(nchar,nvarchar和ntext)在SQL Server 2019预览中保持不变。

    在SQL Server 2019 CTP中与SQL varchar排序规则
    (Collation with SQL varchar in SQL Server 2019 CTP
    )

    Collation in SQL Server defines configurations to determine various rules like case sensitivity, accent sensitivity, sorting, character types and width etc. Understanding all these properties and how do they work with your data become very important. Collation can be set at server, database, expression or column level. UTF-8 supports database-level or column-level collation in SQL Server 2019 CTP and is enabled when you create or change Database or column collation to a collation with UTF8 suffix.

    SQL Server中的排序规则定义配置来确定各种规则,例如区分大小写,重音符号,排序,字符类型和宽度等。了解所有这些属性以及它们如何与数据一起使用变得非常重要。 可以在服务器,数据库,表达式或列级别设置排序规则。 UTF-8在SQL Server 2019 CTP中支持数据库级别或列级别的排序规则,并且在您将数据库或列排序规则创建或更改为带有UTF8后缀的排序规则时启用。

    If you execute the below query against SQL Server 2019 CTP, you will be able to see all the UTF-8 supported collations on your instance of SQL Server using function (fn_helpcollations()).

    如果对SQL Server 2019 CTP执行以下查询,则可以使用函数(fn_helpcollat​​ions())在SQL Server实例上查看所有UTF-8支持的归类。

    SELECT Name, Description 
    FROM fn_helpcollations() 
    WHERE Name like '%UTF8';
    

    UTF-8 collations enabled for SQL varchar in SQL Server 2019 CTP.

    With SQL Server 2019 preview version, we can assign Unicode collations (UTF-8 supported) as well for SQL varchar columns using the COLLATE clause while declaring the varchar column. This way, specific collation is applied to the particular column’s data without impacting the rest of the database.

    在SQL Server 2019预览版中,我们还可以在声明varchar列的同时使用COLLATE子句为SQL varchar列分配Unicode归类(支持UTF-8)。 这样,特定的排序规则将应用于特定列的数据,而不会影响数据库的其余部分。

    Since we are dealing with SQL Server varchar data type in this post, let’s see how Column Collation with SQL varchar datatype works. Execute the code below to alter the SQL Server varchar Column Collation from one collation type to _UTF8 suffix. You can read more on Database Collation from here.

    由于本文中涉及的是SQL Server varchar数据类型,因此让我们看看使用SQL varchar数据类型的列排序是如何工作的。 执行以下代码,将SQL Server varchar列排序规则从一种排序规则类型更改为_UTF8后缀。 您可以从此处阅读有关数据库整理的更多信息

    CREATE TABLE demovarcharcollate
    	  (ID   int PRIMARY KEY,  
    	   Description varchar(50) COLLATE LATIN1_GENERAL_100_CI_AS_SC NOT NULL  
    	  );  
    	ALTER TABLE demovarcharcollate 
    	ALTER COLUMN Description varchar(50) COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8 NOT NULL;  
    

    Changing the Column collation to UTF8 on SQL Server varchar data type.

    SQL varchar在数据转换和数据显示中的作用 (Role of SQL varchar in data conversions and data display)

    SQL Server varchar is widely used in displaying data in the desirable formats using Convert and Cast functions in SQL Server. Real data deals with a mix of data types and it has to be compatible with each other (i.e. belong to the same data type), before we make comparisons to them. SQL Server supports both implicit and explicit conversions.

    SQL Server varchar被广泛用于使用SQL Server中的Convert和Cast函数以所需格式显示数据。 实际数据处理多种数据类型,并且在与它们进行比较之前,它们必须彼此兼容(即属于同一数据类型)。 SQL Server支持隐式和显式转换。

    With an incessant need of formatting and displaying data in the required output, SQL varchar comes really handy. As a SQL developer myself, I find it extremely straightforward to use convert/cast with varchar data type to make assignments or transformations on data, especially for the date fields.

    迫切需要在所需的输出中格式化和显示数据,SQL varchar非常方便。 作为一名SQL开发人员,我发现使用带有varchar数据类型的转换/广播来对数据进行分配或转换非常简单,尤其是对于日期字段。

    I am using table FactInternetSales from Sample DB AdventureWorksDW2017 to show how this feature works. You can refer to any table with some datetime and money/float fields for the practice purpose. The following script converts two datetime columns to SQL varchar types with style 102 and 107 to display the data in the format yyyy.mm.dd and Mon dd, yyyy respectively. Also, the SalesAmount column with Money as a data type is converted to varchar and style 3 is applied to display the amount with commas as shown in the screenshot below. Additionally, say, we would want to see data for the orders placed in the year 2010 only, using the CAST function to convert datetime column to varchar data, the string comparison is performed in the WHERE clause. You can also go over SQL convert date to find more information on date conversion formats and styles.

    我正在使用Sample DB AdventureWorksDW2017中的表FactInternetSales来显示此功能的工作方式。 出于练习目的,您可以引用带有某些日期时间和钱/浮点数字段的任何表。 以下脚本将两个日期时间列转换为样式为102和107SQL varchar类型,以分别以yyyy.mm.dd和Mon dd,yyyy格式显示数据。 同样,将Money作为数据类型的SalesAmount列转换为varchar,并应用样式3以逗号显示金额,如下面的屏幕快照所示。 另外,例如,我们只想查看2010年下订单的数据,使用CAST函数将datetime列转换为varchar数据,则在WHERE子句中执行字符串比较。 您还可以遍历 SQL转换日期 以找到有关日期转换格式和样式的更多信息。

    SELECT OrderDate, CONVERT(varchar, OrderDate, 102) AS FormattedOrderDate,
    ShipDate, CONVERT(varchar(12), ShipDate, 107) AS FormattedShipDate,
    SalesAmount, convert(varchar,salesamount, 3) AS FormattedAmount
    FROM FactInternetSales
    WHERE CAST(OrderDate AS varchar) LIKE '%2010%' 
    

    Displaying data using SQL varchar and CAST & Convert functions.

    使用CAST和CONVERT函数对SQL varchar的字符串长度的影响 (Impact on string length of SQL varchar with CAST and CONVERT functions)

    SQL Server stores long string data in the commonly used varchar data type and it becomes helpful to know the expected and maximum lengths of the strings to display the results in the UI. Copy and execute the below code, where we are passing a long string in an unspecified length varchar variable (@demovarchar) and also in another variable with a defined varchar length (@demovarcharwithcast). Microsoft takes 30 as the default length for SQL Varchar (with unspecified varchar length) in the SQL Server when it is used with CAST and CONVERT functions. In our case, even though the length of the string was 52, it returned 30 as the length as shown in the last result output.

    SQL Server以常用的varchar数据类型存储长字符串数据,这有助于了解预期的字符串长度和最大长度,以在UI中显示结果。 复制并执行以下代码,我们在一个未指定长度的varchar变量(@demovarchar)和另一个具有定义的varchar长度的变量(@demovarcharwithcast)中传递一个长字符串。 Microsoft与CAST和CONVERT函数一起使用时,SQL Server中SQL Varchar的默认长度(未指定varchar长度)为30。 在我们的例子中,即使字符串的长度为52,它也会返回30作为长度,如最后一个结果输出所示。

    One important point to note here is that when an unspecified length varchar field is created, the default length of such field is 1 (shown in red color below). When varchar length is unspecified and is used with CAST or CONVERT functions, the CAST or CONVERT returns n=30 as the default string length of this conversion (marked in blue color below).

    这里要注意的重要一点是,当创建未指定长度的varchar字段时,该字段的默认长度为1(下面以红色显示)。 当未指定varchar length并与CAST或CONVERT函数一起使用时,CAST或CONVERT返回n = 30作为此转换的默认字符串长度(下面以蓝色标记)。

    DECLARE @demovarchar varchar = 'We are learning SQL varchar in this SQLShack article'
    DECLARE @demovarcharwithcast AS varchar(60) =  'We are learning SQL varchar in this SQLShack article'
    SELECT DATALENGTH('We are learning SQL varchar in this SQLShack article') AS 'LenOFStringPassed'
     
    SELECT DATALENGTH(@demovarchar)  AS 'DefaultVarcharLength'
     
    SELECT DATALENGtH(CAST(@demovarcharwithcast AS varchar(60))) AS 'VarcharLengthSpecifiedWithCast'
    SELECT DATALENGTH(CAST(@demovarcharwithcast AS varchar)) AS 'DefaultVarcharLengthWithCast'
    

    Understanding Length of strings concepts in SQL Server varchar when it is used with CAST and CONVERT functions.

    使用SQL varchar的存储和性能注意事项 (Storage and performance considerations using SQL varchar)

    Data types like varchar, char and nvarchar are all used to store string data in SQL Server. SQL varchar stores variable string length whereas SQL char stores fixed string length. This means SQL Server varchar holds only the characters we assign to it and char holds the maximum column space regardless of the string it holds.

    诸如varchar,char和nvarchar之类的数据类型都用于在SQL Server中存储字符串数据。 SQL varchar存储可变的字符串长度,而SQL char存储固定的字符串长度。 这意味着SQL Server varchar仅保留我们分配给它的字符,而char保留最大的列空间,而不管其包含的字符串。

    Because of the fixed field lengths, data is pulled straight from the column without doing any data manipulation and index lookups against varchar are slower than that of char fields. CHAR is better than VARCHAR performance wise, however, it takes unnecessary memory space when the data does not have a fixed-length. So in cases where disk size is not an issue, it is recommended to use CHAR.

    由于字段长度固定,因此无需进行任何数据操作即可直接从列中提取数据,并且针对varchar的索引查找比char字段慢。 CHAR比VARCHAR性能更好,但是,当数据没有固定长度时,它将占用不必要的内存空间。 因此,在磁盘大小不成问题的情况下,建议使用CHAR。

    In simple words, say we have a column with varchar(150) = ‘SQLShack’ – This will take 8 bytes(sqlshack) + 2 bytes for the length information = 10 bytes in actual and for column with char(150) = ‘SQLShack’ – This will consume whole 150 bytes on disk, regardless of what we pass as a string. The below example shows how CHAR uses the maximum allotted space (150) to fit in the string passed and how varchar column uses only the needed space.

    用简单的话来说,假设我们有一列具有varchar(150)='SQLShack'–这将花费8个字节(sqlshack)+ 2个字节来获取长度信息= 10个字节,而对于带有char(150)='SQLShack的列'–这将占用磁盘上的全部150个字节,而不管我们作为字符串传递什么。 下面的示例显示CHAR如何使用最大分配空间(150)来容纳传递的字符串,以及varchar列如何仅使用所需的空间。

    DECLARE @demochar CHAR(150) = 'This is the char value' 
    DECLARE @demovarchar VARCHAR(150) = 'This is the varchar value'
     
    SELECT 'Starting ' + @demochar + ' finishing' AS 'CHAR DATA'
    SELECT 'Starting ' + @demovarchar + ' finishing' AS 'VARCHAR DATA'
    

    Varchar SQL vs char SQL in SQL Server.

    Bottom line is to use the data type that fits our need. You can use SQL varchar when the sizes of the column vary considerably, use varchar(max) when there are chances that string length might exceed 8000 bytes, use char when the sizes of the column are fixed and use nvarchar if there is a requirement to store Unicode or multilingual data.

    底线是使用适合我们需要的数据类型。 当列的大小相差很大时,可以使用SQL varchar;当字符串长度可能超过8000个字节时,可以使用varchar(max);当列的大小固定时,可以使用char;如果需要,可以使用nvarchar。存储Unicode或多语言数据。

    结论
    (Conclusion
    )

    Data types play a fundamental role in database design but they are often overlooked. A good understanding and accurate use of data types ensure correct nature and length of data is populated in the tables. The intention of this tip is to help you gain an understanding of basic characteristics and features of SQL Server varchar along with its performance and storage aspects in SQL Server. We also covered recent advancements in SQL varchar in the SQL Server 2019 Preview.

    数据类型在数据库设计中起着基本作用,但常常被忽略。 对数据类型的充分理解和正确使用可确保在表中填充正确的数据性质和长度。 本技巧的目的是帮助您了解SQL Server varchar的基本特征和特性,以及SQL Server中的性能和存储方面。 我们还在SQL Server 2019预览版中介绍了SQL varchar的最新进展。

    也可以看看 (See also)

    You can check out these other articles to continue your learning on SQL datatypes.

    您可以查看其他文章,以继续学习SQL数据类型。

    翻译自: https://www.sqlshack.com/sql-varchar-data-type-deep-dive/

    展开全文
  • 因最近自己制作的软件需运行在简繁系统中,但数据库设计时...此脚本可批量处理数据库内所有char和varchar转换为nchar和nvarchar,已集成重建主键,约束,索引,此脚本没有启用事务,运行前请备份原数据库或手动增加事务
  • 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...

    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 truncation error.

    我已经看到SQL开发人员在设计表或临时表时使用varchar(max)数据。 我们可能不确定数据长度,或者我们想消除字符串或二进制截断错误。

    Is it a good practice to use varchar(max) for each usage?

    在每种用法中都使用varchar(max)是一种好习惯吗?

    We can define a specific range for the varchar (n) data type, and it is the recommended way to do so. In order to gain understanding about this data type, read SQL varchar(n) article.

    我们可以为varchar(n)数据类型定义一个特定范围,这是推荐的方式。 为了了解这种数据类型,请阅读SQL varchar(n)文章。

    We will discuss the use of varchar max and its implications, comparison with the varchar (n) data type in this article.

    我们将讨论varchar max的用法及其含义,并与本文中的varchar(n)数据类型进行比较。

    VARCHAR(max)SQL Server数据类型概述 (Overview of the VARCHAR(max) SQL Server Data Type)

    The SQL Server 2005 introduced this varchar(max) data type. It replaces the large blob object Text, NText and Image data types. All these data types can store data up to 2 GB. As you might be aware that the basic unit of storage in SQL Server is a page. The page size is 8 KB (8192 byes) in SQL Server, and it is fixed. On a page, SQL Server uses 96 bytes for the page header. We can store 8096 bytes ( 8192-96 bytes) for data in SQL Server. Apart from this, page also contains row overhead and row offset and leaves 8000 bytes to use for data storage. Due to this, we can store up to 8000 bytes of data using varchar (8000) data type.

    SQL Server 2005引入了这种varchar(max)数据类型。 它替换了较大的Blob对象Text,NText和Image数据类型。 所有这些数据类型最多可以存储2 GB的数据。 您可能已经知道,SQL Server中的基本存储单位是页面。 在SQL Server中,页面大小为8 KB(8192个字节),并且它是固定的。 在页面上,SQL Server使用96字节作为页面标题。 我们可以在SQL Server中存储8096字节(8192-96字节)的数据。 除此之外,页面还包含行开销和行偏移量,并保留8000个字节用于数据存储。 因此,我们可以使用varchar(8000)数据类型存储多达8000个字节的数据。

    You might think of using the varchar(max) data type to store 2 GB data to resolve the string truncation issues.

    您可能会想到使用varchar(max)数据类型存储2 GB数据来解决字符串截断问题。

    Let’s create a few sample tables with different size in varchar data type. We will also create a table with a varchar(max) data type.

    让我们在varchar数据类型中创建一些大小不同的示例表。 我们还将创建一个具有varchar(max)数据类型的表。

    CREATE TABLE dbo.Employee_varchar_2000
    (id           INT IDENTITY PRIMARY KEY, 
     Col1 VARCHAR(2000)
    );
     
    CREATE TABLE dbo.Employee_Varchar_4500
    (id           INT IDENTITY PRIMARY KEY, 
     Col1 VARCHAR(4500)
    );
     
    CREATE TABLE dbo.Employee_Varchar_8000
    (id           INT IDENTITY PRIMARY KEY, 
     Col1 VARCHAR(8000)
    );
     
    CREATE TABLE dbo.Employee_Varchar_Max
    (id           INT IDENTITY PRIMARY KEY, 
     Col1 VARCHAR(MAX)
    );
    

    Let’s insert records into these sample tables using the following queries.

    让我们使用以下查询将记录插入这些样本表中。

    INSERT INTO Employee_varchar_2000 (Col1)
    SELECT REPLICATE('A', 2000);
     
     
    INSERT INTO Employee_varchar_4500 (Col1)
    SELECT REPLICATE('A', 4500);
     
    INSERT INTO Employee_varchar_8000 (Col1)
    SELECT REPLICATE('A', 8000);
     
    INSERT INTO Employee_varchar_max (Col1)
    SELECT REPLICATE('A', 8000);
    

    We can verify the data length in these tables using the following queries.

    我们可以使用以下查询来验证这些表中的数据长度。

    Use SQLShackDemo
    go
    SELECT LEN(col1) AS columnlength
    FROM Employee_varchar_2000;
    SELECT LEN(col1) AS columnlength
    FROM Employee_varchar_4500;
    SELECT LEN(col1) AS columnlength
    FROM Employee_varchar_8000;
    SELECT LEN(col1) AS columnlength
    FROM Employee_varchar_max;
    

    In the following screenshot, we can verify the data length is similar to existing table column length.

    在下面的屏幕截图中,我们可以验证数据长度是否与现有表列长度相似。

    Sample table

    Now, we can check the object statistics like page count, row count, and allocation unit using the DMV sys.dm_db_index_physical_stats.

    现在,我们可以使用DMV sys.dm_db_index_physical_stats检查对象统计信息,例如页数,行数和分配单位。

    SELECT OBJECT_NAME([object_id]) AS TableName, 
           alloc_unit_type_desc, 
           record_count, 
           page_count, 
           round(avg_page_space_used_in_percent,0) as avg_page_space_used_in_percent , 
           min_record_size_in_bytes, 
           max_record_size_in_bytes
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED')
    WHERE OBJECT_NAME([object_id]) LIKE 'Employee_varchar%';
    

    We can see that all tables contains the allocation unit IN_ROW_Data. SQL Server stores all data in the IN_ROW_Data allocation unit.

    我们可以看到所有表都包含分配单元IN_ROW_Data。 SQL Server将所有数据存储在IN_ROW_Data分配单元中。

    Allocation Unit for the varchar(max) data type

    We cannot insert more than 8000 bytes data in the varchar(n) data type. If we try to do so , we get the following error message.

    我们不能在varchar(n)数据类型中插入超过8000个字节的数据。 如果尝试这样做,则会收到以下错误消息。

    INSERT INTO Employee_varchar_8000 (Col1)
    SELECT REPLICATE('A', 8001);
     
    Go
     
    INSERT INTO Employee_varchar_8000 (Col1)
    SELECT REPLICATE('A', 10000);
    

    It inserts the data successfully but truncates the values to 8000 characters. Similar truncation occurs for the Employee_varchar_max table containing the varchar(max) data type.

    它成功插入数据,但将值截断为8000个字符。 对于包含varchar(max)数据类型的Employee_varchar_max表,也会发生类似的截断。

    Column data length

    We need to cast the value to varchar(max) and insert for the length above 8000 characters. We get the error message while trying to insert records in Employee_varchar_8000 table.

    我们需要将该值转换为varchar(max)并插入8000个字符以上的长度。 尝试在Employee_varchar_8000表中插入记录时收到错误消息。

    INSERT INTO Employee_varchar_8000 (Col1)
    SELECT REPLICATE(CONVERT(VARCHAR(max), 'x'), 8001); 
    

    It successfully inserts records in the Employee_varchar_max table.

    它成功地将记录插入Employee_varchar_max表中。

    String or binary data tuncation error

    Rerun the query to check the allocation unit. We get the LOB_Data allocation unit to store the data more than 8000 bytes in the Employee_Varchar_Max table. We have a pointer to this data in the IN_Row_DATA allocation unit.

    重新运行查询以检查分配单元。 我们获得LOB_Data分配单元,以将数据存储在Employee_Varchar_Max表中超过8000个字节。 我们在IN_Row_DATA分配单元中有一个指向该数据的指针。

    Allocation Unit for the varchar(max) data type

    We can get the following conclusion from this.

    由此我们可以得出以下结论。

    1. SQL Server uses the IN_ROW_DATA page for the varchar(max) data type if the data is less than or equal to 8000 bytes.

      如果数据小于或等于8000个字节,则SQL Server将IN_ROW_DATA页用于varchar(max)数据类型。
    2. If the data grows beyond the 8000 bytes, SQL Server uses LOB_DATA page for the varchar(max) data type

      如果数据增长到超过8000个字节,则SQL Server将LOB_DATA页用于varchar(max)数据类型

    varchar(max)和varchar(n)数据类型之间的性能比较 (Performance comparison between varchar(max) and varchar(n) data type)

    Let’s insert 10,000 records into each of the tables we created earlier. We want to check the data insertion time. You can use the ApexSQL Generate tool to insert the data without writing the t-SQL code for it.

    让我们在之前创建的每个表中插入10,000条记录。 我们要检查数据插入时间。 您可以使用ApexSQL生成工具插入数据,而无需为其编写t-SQL代码。

    In the following screenshot, you can note the following.

    在以下屏幕截图中,您可以注意以下几点。

    • Employee_varchar_2000 insertion time 0.08 Seconds

      Employee_varchar_2000插入时间0.08秒
    • Employee_varchar_4500 insertion time 0.19 Seconds

      Employee_varchar_4500插入时间0.19秒
    • Employee_varchar_8000 insertion time 0.31 Seconds

      Employee_varchar_8000插入时间0.31秒
    • Employee_varchar_Max insertion time 2.72 Seconds

      Employee_varchar_Max插入时间2.72秒

    Performance comparison

    VARCHAR(N)和VARCHAR(MAX)列上的索引
    (Indexes on VARCHAR(N) and VARCHAR(MAX) columns
    )

    As a DBA, you might not design the table. However, it is required to create an Index on the tables to improve the performance of the query.

    作为DBA,您可能不设计表。 但是,需要在表上创建索引以提高查询的性能。

    We can create an index on the key column of the table holding varchar(n) data type.

    我们可以在包含varchar(n)数据类型的表的键列上创建索引。

    CREATE INDEX IX_Employee_varchar_2000_1 
     ON dbo.Employee_varchar_2000(col1)
    GO
    

    If we try to do the same for the varchar(max) data type, it gives the following error message.

    如果我们尝试对varchar(max)数据类型执行相同的操作,则会给出以下错误消息。

    CREATE INDEX IX_Employee_varchar_max 
     ON dbo.Employee_varchar_max(col1)
    GO
    

    Msg 1919, Level 16, State 1, Line 23 Column ‘col1’ in table ‘dbo.Employee_varchar_max’ is of a type that is invalid for use as a key column in an index.

    消息1919,级别16,状态1,第23行在表'dbo.Employee_varchar_max'中的列'col1'具有无效的类型,不能用作索引中的键列。

    We can use the varchar(max) column as an included column in the index, but you cannot perform the index seek on this column. It will also require additional storage. Therefore, you should avoid creating an index with the varchar(max) data type.

    我们可以将varchar(max)列用作索引中的包含列,但是不能在此列上执行索引查找。 它还需要额外的存储空间。 因此,应避免使用varchar(max)数据类型创建索引。

    执行计划比较 (Execution plan comparison)

    Let’s compare the execution plan of two select statements.

    让我们比较两个选择语句的执行计划。

    In the first query, we want to retrieve data from the Employee_Varchar_2000 table and get the actual execution plan.

    在第一个查询中,我们要从Employee_Varchar_2000表中检索数据并获取实际的执行计划。

    In the actual execution plan, we can see a non-clustered index seek operator.

    在实际的执行计划中,我们可以看到一个非聚集索引查找运算符。

    Execution plan comparisons

    If we run the same query with the varchar(max) data type, it uses a clustered index scan operator, and it can be a resource-intensive operator depending upon the number of rows in the table.

    如果我们使用varchar(max)数据类型运行相同的查询,它将使用聚簇索引扫描运算符,并且它可能是资源密集型运算符,具体取决于表中的行数。

    select col1 from Employee_varchar_max where col1 like ‘xxxx%’

    从Employee_varchar_max中选择col1,其中col1喜欢'xxxx%'

    Execution plan for varchar(max) data type

    Let’s compare the execution plan using the Compare Showplan option of SSMS. To compare two execution plans, save one execution plan by right click on the plan and Save Execution Plan as and provide the location to save the plan.

    让我们使用SSMS的Compare Showplan选项比较执行计划。 要比较两个执行计划,请右键单击一个计划,然后将执行计划另存为,以保存一个执行计划,并提供保存计划的位置。

    In another query execution plan, right-click and choose Compare Showplan. It opens a window, and you can specify the path of the earlier saved execution plan.

    在另一个查询执行计划中,右键单击并选择“比较显示计划”。 它打开一个窗口,您可以指定先前保存的执行计划的路径。

    In the following screenshot, you can see the comparison between both execution plans.

    在以下屏幕截图中,您可以看到两个执行计划之间的比较。

    • The estimated CPU cost is higher in the varchar(max) data type for a similar activity as of varchar(2000)

      对于与varchar(2000)类似的活动,在varchar(max)数据类型中,估计的CPU成本较高。
    • For the varchar(max) it uses clustered index scan operator and scans all records. You can see this the estimated number of rows is 10000 while in the varchar(2000) data type it uses index seek operator and estimated number of rows is 1.96078

      对于varchar(max),它使用聚簇索引扫描运算符并扫描所有记录。 您可以看到,估计的行数为10000,而在varchar(2000)数据类型中,它使用索引查找运算符,估计的行数为1.96078
    • Estimated row size 4035 B is greater than in varchar(max) compare to the 1011 B for the varchar(2000) data type

      与varchar(2000)数据类型的1011 B相比,估计的行大小4035 B大于varchar(max)

    Execution plan comparison of varchar(max) and varchar(n)

    varchar(max)和varchar(n)数据类型之间的区别 (Difference between the varchar(max) and varchar(n) data type)

    varchar(max)

    varchar(n)

    We can store up to 2 GB of data in this data type

    We can store up to 8000 bytes data in this data type

    It uses the allocation unit IN_ROW_Data up to 8000 bytes of data. If data is more than 8000 bytes, it uses the LOB_Data page and stores its pointer in the IN_ROW_Data page

    It stores data in the standard data page

    We cannot create an index on the key column of the varchar(max) data type

    We can create an index on this data type

    We cannot compress the LOB data

    We can compress data for this data type

    Data retrieval and updation on the LOB data is relatively slow

    We do not face such issue in the varchar(n) data type

    varchar(最大)

    varchar(n)

    我们可以在这种数据类型中存储多达2 GB的数据

    我们可以在这种数据类型中存储多达8000个字节的数据

    它使用分配单元IN_ROW_Data最多8000字节的数据。 如果数据超过8000个字节,它将使用LOB_Data页并将其指针存储在IN_ROW_Data页中

    它将数据存储在标准数据页面中

    我们无法在varchar(max)数据类型的键列上创建索引

    我们可以在此数据类型上创建索引

    我们无法压缩LOB数据

    我们可以为此数据类型压缩数据

    LOB数据的数据检索和更新相对较慢

    我们不会在varchar(n)数据类型中遇到此类问题

    结论 (Conclusion)

    In this article, we demonstrated varchar(max) data type and also explored several differences between the varchar(max) and varchar(n) data types. You should use an appropriate data type. We should consider the database design, performance, compression, indexes in mind. You should review the data types in your database and change it if required with proper testing.

    在本文中,我们演示了varchar(max)数据类型,还探讨了varchar(max)和varchar(n)数据类型之间的一些区别。 您应该使用适当的数据类型。 我们应该考虑数据库的设计,性能,压缩,索引。 您应该查看数据库中的数据类型,并在需要时通过适当的测试进行更改。

    翻译自: https://www.sqlshack.com/varcharmax-data-type-walkthrough-and-its-comparison-with-varcharn-in-sql-server/

    展开全文
  • 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字节),...

    一. varchar存储规则:

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

     

    二. varchar和char 的区别:

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

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

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

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

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

     

     

     ps :被问到一个问题:MySQL中varchar最大长度是多少?这不是一个固定的数字。本文简要说明一下限制规则。

     

    1、限制规则

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

    a) 存储限制

    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 byte。

    mysql> create table t1 ( name varchar(65532) default null)charset=latin1;
    Query OK, 0 rows affected (0.09 sec)
    
    mysql> 
    mysql> create table t2 ( name 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. You have to change some columns to TEXT or BLOBs
    mysql> 

    可以看见当设置长度为65533时,已经超过行最大长度,我们可以计算一下,行最大长度是65535字节。上面t2表name字段使用varchar(65533),字符集是latin1,占用1个字节。还有默认为空,那么还有null标识位,( 1 + 7 ) / 8 =1,所以null标识位占用1个字节。现在我们来看看,65533 + 1 + 2=65536字节,已经大于行最大长度。这里2字节怎么来的???因为varchar类型存储变长字段的字符类型,与char类型不同的是,其存储时需要在前缀长度列表加上实际存储的字符,当存储的字符串长度小于255字节时,其需要1字节的空间,当大于255字节时,需要2字节的空间。

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

    mysql> create table t2 ( name varchar(65533) not null) charset=latin1;   
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> 
    mysql> create table t3 ( name varchar(65534) not null) charset=latin1;  
    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
    mysql> 

    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,例子如下:

    mysql> create table t4(c int, c2 char(30), c3 varchar(21812)) charset=utf8; 
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> 
    mysql> create table t5(c int, c2 char(30), c3 varchar(21813)) charset=utf8;  
    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
    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 NULL,
    g VARCHAR(100) DEFAULT NULL,
    h VARCHAR(100) DEFAULT NULL,
    i VARCHAR(N) DEFAULT NULL
    ) CHARSET=utf8;                                                                                                                                                                                                                   

    复制代码

    那么上面这条语句中的varchar(N)的最大值是多少呢?

    让我们来计算一下

    每个NULL字段用1bit标识,10个字段都是default null,那么需要用(10+7)/8bit = 2 bytes存储NULL标识位。int占用4个 byte。

    (65535 - 1 - 2*8  -4 - 100*3*8 -2)/3=21037

    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 NULL, g VARCHAR(100) DEFAULT NULL, h VARCHAR(100) DEFAULT NULL, i VARCHAR(21037) DEFAULT NULL ) CHARSET=utf8;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> 
    mysql> CREATE TABLE t7 ( 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 NULL, g VARCHAR(100) DEFAULT NULL, h VARCHAR(100) DEFAULT NULL, i VARCHAR(21038) DEFAULT NULL ) CHARSET=utf8;  
    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
    mysql> 

     可以看见多一个字符都报错了。

    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字段的物理存储方式也将会发生变化。

     

    参考资料:

    http://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html

    <<MySQL技术内幕--InnoDB引擎第二版>>

    展开全文
  • oracle char,varchar,varchar2的区别和使用方法 非本人总结,但是说的挺好的! 欢迎下载
  • 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...
  • 支持超过4000字节的varchar2类型

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

    千次阅读 2020-05-07 23:41:03
    MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、...
  • 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...
  • oracle中varchar2(byte)和varchar2(char) 细节决定成败,大家在设计数据库建表的时候一定要注意。
  • 数据库中varchar类型 最大长度是多少?

    万次阅读 多人点赞 2019-10-09 20:57:00
    varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),...
  • mysql关于varchar字段

    千次阅读 2018-09-03 16:54:30
    varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)  5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节)...
  • os: centos 7.4 db: postgresql 11.5 db: oracle 11.2.0.4 192.168.56.110 mas 192.168.56.111 sla1 ...oracle varchar2(n) 表示 n 个字节 postgresql varchar(n) 表示 n 个字符 版本 # cat /etc/centos-r...
  • varchar2和varchar的区别

    千次阅读 2019-06-14 17:14:31
    1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节; 2.VARCHAR2把空串等同于null处理,而varchar仍按照空串处理; 3.VARCHAR2字符要用几个字节...
  • postgresql数据库varchar、char、text的比较 2017年08月04日 09:24:53password-u阅读数:19690 名字 描述 character varying(n),varchar(n) 变长,有长度限制 ...
  • varchar和text说不清的那些事

    千次阅读 2019-07-26 17:03:24
    最近有几个同学问我varchar和text有啥别吗,这个问题,以前说真的也没太多的整理,以前遇到text在设计中就是尽可能的拆到另一个表中,保持主表尽量的瘦小,可以让innodb bp缓存更多的数据。 今天借次机会系统整理...
  • MySql : varcharvarchar 的区别

    千次阅读 2018-07-04 12:10:44
    MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊 一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【勘误:varchar在实际存储的时候会多一个byte用来存放长度...
  • 一、背景 &amp;amp;nbsp;&amp;amp;nbsp;...根据业务需求,发现以前的同事在设计表的时候,很多字段都没有设置默认值。...对于常见的int类型,默认值为0就好,但是对于varchar类型呢,默认值是设置为”还是N
  • 【oracle】varcharvarchar2区别

    万次阅读 2019-07-02 16:40:48
    1.varchar是标准sql里面的。varchar2是oracle提供的独有的数据类型。 2.varchar对于汉字占两个字节,对于英文是一个字节,占的内存小,varchar2都是占两个字节。 3.varchar对空串不处理,varchar2将空串当做null来...
  • MySQL中CHAR和VARCHAR区别

    千次阅读 2020-12-09 09:39:03
    以下都是基于mysql5.0以上版本而言,也就是char和varchar括号内指定的都是最大字符数,话不多说先上结论: 行为 char字段 varchar字段 最大长度 255字符 括号中最大的字符数通过编码来算,不超过行65535个...
  • char 定长 最多255字符 末尾的空格会被默认删除 何时选用char类型储存? 1 数据长度近似 如手机号 身份证 MD5加密后的值 2 短字符串 相对varchar可以节约一个储存长度的...每行的varchar总和不得超过65535字节 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 784,194
精华内容 313,677
关键字:

varchar