精华内容
下载资源
问答
  • 我有个同事贼坑,创建数据库时,本来数据库字段应该使用int类型,然后却选成varchar,最后在使用一些功能里面使用order by语句时,导致出现问题。 1、数据库字段为int类型:  使用order by 时,正常排序,如: ...

    我有个同事贼坑,创建数据库时,本来数据库字段应该使用int类型,然后却选成varchar,最后在使用一些功能里面使用order by语句时,导致出现问题。

    1、数据库字段为int类型:

     使用order by 时,正常排序,如:

    select * from table order by field desc
     输出:

    11
    10
    9
    1

    2、数据库字段为varchar类型:

     使用order by时,示例如下:

    select * from table order by field desc
     输出:

    9
    11
    10
    1

     容易看出,varchar中,使用order by时,9 > 11 > 10 > 1

     有点类似于java中的字符串比较大小

    3、解决办法:

     1)可以将数据库字段修改为int类型

     2)如果不能修改数据库字段,可以将sql修改为如下(在字段后面加一个0):

    select * from table order by field + 0 desc

    展开全文
  • oracle char,varchar,varchar2的区别和使用方法 非本人总结,但是说的挺好的! 欢迎下载
  • VARCHAR和CHAR类型使用场景

    千次阅读 2020-09-19 09:00:05
    目录 varchar char VARCHAR(5)与VARCHAR(200)的区别 varchar VARCHAR类型用于存储可变...VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个

    目录

    varchar

    char

    VARCHAR(5)与VARCHAR(200)的区别

    总结


    varchar

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

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

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

    下面这些情况下适用VARCHAR是合适的:

    • 字符串列的最大长度比平均长度大很多
    • 列的更新很少,所以碎片不是问题
    • 使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储

    char

    CHAR类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格。CHAR值会根据需要采用空格进行填充以方便比较。例如插入"string "存储时会是"string"

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

    VARCHAR(5)与VARCHAR(200)的区别

    我们倘若用VARCHAR(5)和VARCHAR(200)来存储'hello',我们知道这两者的空间开销是一样的。那么我们可以让VARCHAR的长度始终保持很大吗?使用更短的列有什么优势吗?

    事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。

    所以最好的策略是只分配真正需要的空间

    总结

    当我们为字符串类型的字段选取类型的时候,判断该选取VARCHAR还是CHAR,我们可以从以下几个方面来考虑:

    • 该字段数据集的平均长度与最大长度是否相差很小,若相差很小优先考虑CHAR类型,反之,考虑VARCHAR类型。
    • 若字段存储的是MD5后的哈希值,或一些定长的值,优先选取CHAR类型。
    • 若字段经常需要更新,则优先考虑CHAR类型,由于CHAR类型为定长,因此不容易产生碎片。
    • 对于字段值存储很小的信息,如性别等,优先选取CHAR类型,因为VARCHAR类型会占用额外的字节保存字符串长度信息。

    总之一句话,当我们能够选取CHAR类型的时候,或者说空间消耗相对并不是影响因素的重点时,尽量选取CHAR类型,因为在其他方面,CHAR类型都有着或多或少的优势。而当空间消耗成为了很大的影响因素以后,我们则考虑使用VARCHAR类型

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

    展开全文
  • MySQL varchar和char区别与使用场景记录

    千次阅读 2020-09-11 15:35:17
    varchar存储MySQL字符串类型数据。 ...占用空间和使用字符集相关 gbk(每字符占用2字节) utf8(每字符占用3字节) utf8mb4(每字符占用4字节) 为什么是 varchar(255)? 以varchar(255)为例,

    在这里插入图片描述

    varchar存储MySQL字符串类型数据。
    本文基于MySQL 5.7x

    varchar有以下特点:

    • MySQL规定:一行数据的最大长度是65535字节,注意,是字节(byte),text、blob等大字段类型除外。
    • varchar的存储需要单独记录其长度,是在列之外占用的空间,但包括在每行总字节数限制内。
    • 占用空间和使用字符集相关
      • gbk(每字符占用2字节)
      • utf8(每字符占用3字节)
      • utf8mb4(每字符占用4字节)

    为什么是 varchar(255)?

    以varchar(255)为例,这里的255表示字符数,假设字符集是utf8,那么存储汉字占用的字节数是255*3=765。那么为什么我们看到有很多情况数据库里的varchar字段长度是255呢?

    每个业务场景可能有特定的原因,但是设置为255有一些优点:

    • 在utf8字符集下,每个字符占3字节。
    • mysql innodb引擎的每个索引列长度限制为767字节(bytes),255*3=765,255恰好是不超过索引长度限制的最大长度。
    • 节省1byte空间。varchar字段需要单独记录其长度,1byte(8bit)无符号可表示的最大数是2^8-1=255,如果超过255(小于512)则需要多申请1byte来记录字段长度。

    该用char还是varchar?

    char:定长字符串
    varchar:可变长字符串
    char和varchar区别,以char(32)和varchar(32)举例:

    char(32)varchar(32)
    占用空间固定32字符1(如果数据长度不够32将用空格补齐)跟随实际存储内容长度,但不超过32
    空格处理检索时会去掉尾部空格(数据本身有空白符也会被去掉)不会对空格处理
    是否记录字段长度是。额外拿出空间记录字段数据长度(字符数)
    适用场景存储的数据长度基本一致,不需要空格,eg 手机号、UUID、密码加密后的密文数据长度不一定,长度范围变化较大的场景

    1. 占用空间需根据字符集转换为字节,以utf8为例,每字符占3字节。 ↩︎

    展开全文
  • char ...varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长
  • 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和char的使用场景?

    千次阅读 2020-04-04 23:01:45
    1.char的长度是不可变的,而varchar的长度是可变的。 定义一个char[10]和varchar[10]。 如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,varchar就立马把长度变为4了,取...
  • mysql关于varchar字段

    千次阅读 2018-09-03 16:54:30
    varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)  5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节)...
  • varchar2和varchar的区别

    千次阅读 2019-06-14 17:14:31
    1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节; 2.VARCHAR2把空串等同于null...大部分情况下建议使用varchar2类型,可以保证更好的兼容性 ...
  • 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的类型去查询datatime,MySQL就是帮我们做了一次类型转换才得以查询 这篇文章写得很好...
  • char和varcharvarchar的区别

    千次阅读 2016-09-20 17:30:51
    char和varchar 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10...
  • varcharvarchar2区别

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

    万次阅读 2016-03-25 09:41:30
    这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM中的varchar等问题,需要的朋友可以参考下
  • 【oracle】varcharvarchar2区别

    万次阅读 2019-07-02 16:40:48
    1.varchar是标准sql里面的。varchar2是oracle提供的独有的数据类型。 2.varchar对于汉字占两个字节,对于英文是一个字节,占的内存小,varchar2都是占两个字节。 3.varchar对空串不处理,varchar2将空串当做null来...
  • 区别: 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大...
  • 从两个执行计划看出,varchar类型输入,不管索引字段是int还是varchar都可以使用索引。   说明: 为什么varchar类型输入,索引是int类型或者是varchar类型的字段,都能生效呢? 原因是mysql在执行的...
  • `output_value` varchar(20) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `test` VALUES (1, '12.12'); INSERT INTO `test` VALUES (2, '12....
  • MySQL索引使用:字段为varchar类型时,条件要使用' '包起来 结论: 当MySQL中字段为int类型时,搜索条件where num=‘111‘ 与where num=111都可以使用该字段的索引。 当MySQL中字段为varchar类型时,搜索条件where...
  • 一、背景 &amp;amp;nbsp;&amp;amp;nbsp;...根据业务需求,发现以前的同事在设计表的时候,很多字段都没有设置默认值。...对于常见的int类型,默认值为0就好,但是对于varchar类型呢,默认值是设置为”还是N
  • MySQL中varchar无法使用max和min函数

    千次阅读 2018-08-01 13:37:30
    直接对varchar类型使用min函数或者max函数结果是错误的,可以使用下面的方式 1、将需要使用max()函数的字段后面加0,比如字段:field是要使用max()函数的字段,那么只要 SELECT MAX(field+0) FROM tablename ...
  • 细说varchar与char有哪些区别?

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

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

    千次阅读 2018-02-05 22:15:14
    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当...
  • DB2使用说明LONG VARCHAR 字段默认情况下,MyBatis Generator将LONG VARCHAR字段映射到java.lang.String数据类型,并将这些字段标记为jdbcType =“LONGVARCHAR”。当从DB2检索数据时,此映射将导致错误。应将DB2 ...
  • MySql : varcharvarchar 的区别

    千次阅读 2018-07-04 12:10:44
    这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。 ---------------------------------总结--------------------------------------------- 二者在磁盘上...
  • oracle 11g varchar/varchar2

    千次阅读 2018-06-02 20:28:59
    以前学oracle的时候,用varchar比较多,今天在oracle 11g中,发现用的都是varchar2,例如我这样创建表:可以看到,如果使用varchar,也会自动转为varchar2。
  • 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...
  • varchar(100) 100 代表什么意思 mysql 5.0.3 以前 代表可以存储100个字节 msyql 5.0.3 之后 代表可以存储100个字符 MySQL要求一个行定义长度不能超过65535个字节,不包括text、blob等大字段类型,varchar长度受...

空空如也

空空如也

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

varchar使用