Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 与NVARCHAR相比,创建列VARCHAR(somenumber)有什么好处?_Mysql_Sql_Database Design - Fatal编程技术网

Mysql 与NVARCHAR相比,创建列VARCHAR(somenumber)有什么好处?

Mysql 与NVARCHAR相比,创建列VARCHAR(somenumber)有什么好处?,mysql,sql,database-design,Mysql,Sql,Database Design,在我的开发过程中,我总是让我的VARCHAR列有一个字符长度,例如summary VARCHAR(250),因为我认为“250个字符应该足以容纳摘要。”然后,当内容管理器告诉我他们在编写摘要时出错时,我会延长它我很少会遇到这样的情况,即我确实知道列中的文本应该精确或最多有多长。因此,我似乎应该使用NVARCHAR,我假设它的底层数据结构是动态字符数组,而不是固定大小的字符数组。或者我应该使用VARCHAR(somenumber) NVARCHAR完全不是你认为它的意思。N只是指使用unicode

在我的开发过程中,我总是让我的
VARCHAR
列有一个字符长度,例如
summary VARCHAR(250)
,因为我认为“250个字符应该足以容纳摘要。”然后,当内容管理器告诉我他们在编写摘要时出错时,我会延长它我很少会遇到这样的情况,即我确实知道列中的文本应该精确或最多有多长。因此,我似乎应该使用
NVARCHAR
,我假设它的底层数据结构是动态字符数组,而不是固定大小的字符数组。或者我应该使用
VARCHAR(somenumber)

NVARCHAR完全不是你认为它的意思。
N
只是指使用unicode字符而不是ascii字符(顺便说一句,这对于摘要字段可能是个好主意)。NVARCHAR列仍然需要长度。

您对NVARCHAR的理解是错误的。NVARCHAR用于Unicode字符串。您还可以为NVARCHAR指定最大长度。NVARCHAR比VARCHAR占用更多空间,但可以使用的字符和符号范围更广

在SQL Server中,如果未指定最大长度,则默认为1。因此,仅将其声明为NVARCHAR与NVARCHAR(1)相同。VARCHAR也是如此。此外,对于VARCHAR和NVARCHAR,长度不是固定的大小,它只指定最大大小

您在MySQL和SQL Server上标记了这个问题;我不知道MySQL中默认的是什么


你可以选择VARCHAR(MAX),但要小心。使用MAX更改SQL Server数据库引擎存储数据的方式。它像文本字段一样存储它,而文本字段没有VARCHAR字段的所有功能。改用VARCHAR(8000)。

这是用于SQL Server的吗?

主要问题是应用程序是否需要支持文化信息,如各种语言

如果需要这种支持,NVARCHAR()将存储unicode字符并支持所有类型的语言。记住,每个字符需要两个字节

如果应用程序仅为美国公司内部,VARCHAR()将为每个字符节省一个字节

如果我记得在SQLServerInternals一书中,带有字符串“HelloWorld”的VARCHAR(25)有11个字符长,开销为两个字节

让我们回顾一下

DECLARE @A CHAR(11) = "HELLO WORLD"     -- Takes 11 characters to store 
DECLARE @B VARCHAR(11) = "HELLO WORLD"  -- Takes 13 characters to store
DECLARE @C NVARCHAR(11) = "HELLO WORLD"  -- Takes 24 characters to store 
祝你的文字好运

约翰·米纳
狡猾的DBA

您使用的是MySQL还是SQL Server?它们存储字符串的方式不同。但是,无论哪种情况,你的假设都是错误的。长度为255的
nvarchar()
varchar()
都支持255个字符。区别在于什么是角色。如果您想要更长的字段,请在SQL Server中使用
varchar(max)
varchar(8000)
或在MySQL中使用
text
varchar()。主要区别在于存储位置。行内、行溢出和LOB页面。详情见卡伦。您不能在VARCHAR(MAX)字段上放置常规索引。如果您有一个大的VARCHAR(X)字段,但有一个大的X,那么您需要一个全文索引。对中间模式的任何搜索都会导致一个完整的表扫描。它不是一个可搜索的列。简言之,你的陈述是误导性的!