SQL Server 中 char、varchar、nchar 和 nvarchar 数据类型之间的区别?
SQL 中 char
和 varchar
的区别是什么,其次是 nchar
和 nvarchar
,是热门的 SQL 面试问题之一,令人惊讶的是并不是每个程序员都知道这个基本区别。 如果大家从名称出发(应该这样做),那么就会发现 char
是一种固定长度的数据类型,而 varchar
应该是一种可变长度的数据类型。 尽管所有 char
、varchar
、nchar
和 nvarchar
都用于存储文本或字符串数据,但它们之间存在细微差别。 正如我所说的 char
是固定长度的,这意味着像 Zipcode char(10)
这样的变量或列将只需要 10 个字节来存储数据,包括空间。
另一方面,varchar
变量或列将占用变量空间,具体取决于存储的数据 + 2 个用于存储长度的额外字节,正如我在之前关于 varchar 变量在磁盘中占用多少空间的文章中所解释的那样。 例如,对于列 varchar name(20)
,如果存储 “Jack”(4 + 2) ,将占用 6 个字节,如果存储 “Jones”(5 + 2) ,则占用 7 个字节。
为了获得更好的性能,我们应该将 char 用于固定长度的列,例如邮政编码,其中每一行都在一定长度以下,例如 印度为 6 ,美国为 5 + 4 位邮政编码。
另一方面,对于可变长度的列,最好使用 varchar
数据类型来节省空间,如果实际数据总是远小于容量,则在 char
类型的情况下会浪费空间。
特别是,这个问题是和其他一系列流行的 SQL 面试问题同样重要,例如 WHERE 和 HAVING 子句与编写 SQL 查询以连接三个表之间的区别。 如果我们遇到任何其他有趣的 SQL 查询,那么也可以与我们分享,如果你不知道答案,我们将一起尝试找出答案。
如何在 SQL 示例中使用 NCHAR 与 NVARCHAR
现在让我们看看 SQL 中 nchar
和 nvarchar
数据类型的区别。 nchar(n)
和 nvarchar(n)
类似于对应的 char
和 varchar
,但占用的空间是它们的两倍,以支持多语言。 额外的空间用于存储每个字符的 Unicode 字符,这意味着每个字符 2 个字节,1 个字符 + 1 个 Unicode。
除了这个基本问题之外,我们还经常会看到一些后续问题,例如何时在数据库中使用 char
和 varchar
? 或者更常见的是 char(20)
和 varchar(20)
变量之间的区别是什么,因为它们只能存储 20 个字节来存储数据。
好吧,主要区别在于 varchar
可能需要更少的字节,具体取决于我们存储在其上的数据长度。 例如,如果我们将“USA”存储在类型为 char(20)
和 varchar(20)
的变量中,那么第一个将占用 20 个字节,而第二个将只占用 5 个字节 (3 +2) ,但是 char
列的性能 在 SELECT
查询中比 varchar
列更好。
同样,如果我们使用 nchar(20)
和 nvarchar(20)
来存储“SQL”字符串,那么第一个变量将占用 40 个字节 (2*20) ,第二个变量将占用 8 个字节 (3*2 +2) 。
以下是 char(10)
、varchar(10)
、nchar(10)
和 nvarchar(10)
变量存储相同数据需要多少空间的摘要:
declare @cData char(10)
set @cData = 'SQL' -- 10 bytes
set @cData = 'Java' -- 10 bytes
declare @vcData varchar(10)
set @vcData = 'SQL' -- 3 + 2 = 5 bytes
set @vcData = 'Java' -- 4 + 2 = 6 bytes
declare @ncData nchar(10)
set @ncData = 'SQL' -- 10*2 = 20 bytes
set @ncData = 'Java' -- 10*2 = 20 bytes
declare @nvcData varchar(10)
set @nvcData = 'SQL' -- 3*2+2 = 8 bytes
set @nvcData = 'Java' -- 4*2+2 = 10 bytes
谢谢大伙,这就是 SQL 中 char
和 varchar
数据类型以及 nchar
与 nvarchar
之间的区别。 我希望这些基础知识不仅有助于 SQL 面试,还有助于为表中的列和存储过程中的变量选择正确的类型。 如果大家对 char
或 varchar
变量有任何疑问或问题,请告诉我。
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。