只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?
当前回答
你说得对。nvarchar存储Unicode数据,而varchar存储单字节字符数据。除了您已经提到的存储差异(nvarchar需要两倍于varchar的存储空间)之外,更喜欢nvarchar而不是varchar的主要原因是国际化(即以其他语言存储字符串)。
其他回答
Varchar(n)和nvarchar(n)之间的主要区别是:
Varchar(可变长度,非Unicode字符数据)大小最大为8000。
它是可变长度数据类型用于存储非Unicode字符每个字符占用1字节的空间
Nvarchar:可变长度Unicode字符数据。
它是可变长度数据类型用于存储Unicode字符。数据以Unicode编码存储。每一个支持语言。(例如阿拉伯语、德语、印地语等)
我不得不在这里说(我意识到我可能会打开自己的心扉!),但NVARCHAR确实比VARCHAR更有用(注意更多!)的唯一时间是,所有从属系统上的所有排序规则和数据库本身都是相同的。。。?如果没有,那么无论如何都必须进行排序规则转换,因此VARCHAR和NVARCHAR一样可行。
除此之外,一些数据库系统,如SQL Server(2012年之前)的页面大小约为8K。因此,如果您要存储未保存在TEXT或NTEXT字段中的可搜索数据,那么VARCHAR提供了8k的完整空间,而NVARCHAR仅提供4k(双倍字节,双倍空间)。
总之,我想,两者的使用取决于:
项目或上下文基础设施数据库系统
我会说,这取决于情况。
如果您开发一个桌面应用程序,其中操作系统以Unicode(与所有当前的Windows系统一样)工作,并且语言本身支持Unicode(默认字符串为Unicode,如Java或C#),那么使用nvarchar。
如果您开发了一个web应用程序,其中字符串以UTF-8形式出现,语言为PHP,而PHP本身仍然不支持Unicode(在5.x版本中),那么varchar可能是一个更好的选择。
varchar仅用于非Unicode字符,而nvarchar用于Unicode和非Unicode字符。下面给出了它们之间的一些其他差异。
VARCHAR与NVARCHAR
VARCHAR | NVARCHAR | |
---|---|---|
Character Data Type | Variable-length, non-Unicode characters | Variable-length, both Unicode and non-Unicode characters such as Japanese, Korean, and Chinese. |
Maximum Length | Up to 8,000 characters |
Up to 4,000 characters |
Character Size | Takes up 1 byte per character |
Takes up 2 bytes per Unicode/Non-Unicode character |
Storage Size | Actual Length (in bytes) | 2 times Actual Length (in bytes) |
Usage | Used when data length is variable or variable length columns and if actual data is always way less than capacity | Due to storage only, used only if you need Unicode support such as the Japanese Kanji or Korean Hangul characters. |
Jeffrey L Whitledge推荐使用nvarchar,评分约47000
Solomon Rutzky的声誉评分约为33200,建议:不要总是使用NVARCHAR。这是一种非常危险且代价高昂的态度/方法。
varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?
https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4
两人都享有如此高的声誉,学习型sql server数据库开发人员会选择什么?
如果您的选择不一致,在回答和评论中会有很多关于性能问题的警告。
有关于性能的评论pro/con nvarchar。
有关于性能的评论pro/con varchar。
我对具有数百列的表有一个特殊的要求,这本身可能是不寻常的?
我选择varchar是为了避免接近SQL*服务器2012的8060字节表记录大小限制。
对我来说,nvarchar的使用超过了8060字节的限制。
我还认为应该将相关代码表的数据类型与主中心表的数据匹配。
我曾在南澳大利亚州政府的这个工作场所看到过有经验的数据库开发人员使用varchar列,其中表行数将达到数百万或更多(在这些非常大的表中,如果有nvarchar列的话),因此可能预期的数据行量成为了这一决定的一部分。
推荐文章
- 在SQL server查询中将NULL替换为0
- 在SQL中修改表的模式名
- 如何得到累计和
- 如何在SQL Server 2005的一条语句中更新两个表?
- 如何创建临时表与SELECT * INTO tempTable从CTE查询
- 在SQL Server的选择语句中使用带TOP的变量,而不是动态的
- SQL变量保存整数列表
- 在SQL中转换月号到月名函数
- 改变一个varchar列的最大长度?
- 如何在SQL中从DateTime格式获取时间?
- 暂时关闭约束(MS SQL)
- WHERE子句中的IF子句
- 如何在SSMS中从ntext或nvarchar(max)查看所有文本?
- 创建表如果在SQL Server中不存在
- MSSQL错误“底层提供者在打开时失败”