只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?
当前回答
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列的话),因此可能预期的数据行量成为了这一决定的一部分。
其他回答
这取决于Oracle的安装方式。在安装过程中,将设置NLS_CHARACTERSET选项。您可以使用查询SELECT值$FROM sys.props$WHERE name=“NLS_CHARACTERSET”找到它。
如果NLS_CHARACTERSET是像UTF8这样的Unicode编码,那就太好了。使用VARCHAR和NVARCHAR几乎完全相同。现在停止阅读,继续阅读。否则,如果您无法控制Oracle字符集,请继续阅读。
VARCHAR-数据存储在NLS_CHARACTERSET编码中。如果同一服务器上有其他数据库实例,您可能会受到它们的限制;反之亦然,因为您必须共享设置。这样的字段可以存储可以使用该字符集编码的任何数据,而不存储其他数据。因此,例如,如果字符集是MS-1252,则只能存储英文字母、少数重音字母和其他一些字符(如€和-)。您的应用程序仅对少数地区有用,无法在世界其他任何地方运行。因此,这被认为是一个坏主意。
NVARCHAR-数据以Unicode编码存储。支持每种语言。好主意。
存储空间呢?VARCHAR通常是高效的,因为字符集/编码是为特定的语言环境定制的。NVARCHAR字段以UTF-8或UTF-16编码存储,讽刺的是基于NLS设置。UTF-8对于“西方”语言非常有效,同时仍然支持亚洲语言。UTF-16对亚洲语言非常有效,同时仍然支持“西方”语言。如果担心存储空间,请选择NLS设置以使Oracle根据需要使用UTF-8或UTF-16。
处理速度如何?大多数新的编码平台本机使用Unicode(Java、.NET,甚至是多年前的C++std::wstring!),所以如果数据库字段是VARCHAR,它会迫使Oracle在每次读取或写入时在字符集之间进行转换,这就不太好了。使用NVARCHAR可避免转换。
底线:使用NVARCHAR!它避免了限制和依赖性,对存储空间很好,通常对性能也是最好的。
varchar:可变长度、非Unicode字符数据。数据库排序规则确定使用哪个代码页存储数据。
nvarchar:可变长度Unicode字符数据。取决于用于比较的数据库排序规则。
掌握了这些知识后,使用与输入数据匹配的数据(ASCII与Unicode)。
我看了一下答案,许多人似乎建议使用nvarchar而不是varchar,因为空间不再是问题,所以启用Unicode以获得很少的额外存储不会有什么害处。嗯,当你想在列上应用索引时,这并不总是正确的。SQL Server对可以索引的字段的大小限制为900字节。因此,如果您有一个varchar(900),您仍然可以对其进行索引,但不能对varchar(901)进行索引。使用nvarchar,字符数减半,因此可以索引到nvarchar(450)。因此,如果您确信不需要nvarchar,我不建议使用它。
一般来说,在数据库中,我建议您坚持所需的大小,因为您可以随时扩展。例如,一位同事曾经认为,对列使用nvarchar(max)没有害处,因为我们在存储方面完全没有问题。后来,当我们试图对此列应用索引时,SQL Server拒绝了这一点。然而,如果他甚至从varchar(5)开始,我们可以简单地将其扩展到我们需要的内容,而不会出现这样的问题,这将要求我们制定一个字段迁移计划来解决这个问题。
我总是使用nvarchar,因为它允许我正在构建的任何东西都能承受我扔给它的几乎所有数据。我的CMS系统使用中文是偶然的,因为我使用了nvarchar。现在,任何新的应用程序都不应该真正关注所需的空间量。
nvarchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(多种语言),则需要N变量。
推荐文章
- 我如何在T-SQL用逗号格式化一个数字?
- LEFT OUTER JOIN如何返回比左表中存在的记录更多的记录?
- 如何用SQL语句计算百分比
- SQL Server动态PIVOT查询?
- 如何等待2秒?
- SQL Server: CROSS JOIN和FULL OUTER JOIN的区别是什么?
- varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?
- 向现有表添加主键
- 我应该在SQL varchar(长度)中考虑电话的最长的全球电话号码是什么
- 表中标识列的显式值只能在使用列列表且IDENTITY_INSERT为ON SQL Server时指定
- 如何确定已安装的SQL Server实例及其版本?
- Scope_Identity()、Identity()、@@Identity和Ident_Current()之间的区别是什么?
- 如何在TSQL中刷新打印缓冲区?
- 如何用一个SQL查询从数据库中删除所有表?
- SQL查询返回两个表之间的差异