只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?


当前回答

我的两分钱

如果不使用正确的数据类型,索引可能会失败:在SQL Server中:当您在VARCHAR列上有一个索引并将其呈现为Unicode字符串时,SQL Server不会使用该索引。当您向包含SmallInt的索引列提供BigInt时,也会发生同样的情况。即使BigInt小到可以成为SmallInt,SQL Server也无法使用索引。另一方面,您没有这个问题(当向索引的BigInt或NVARCHAR列提供SmallInt或Ansi代码时)。不同DBMS(数据库管理系统)的数据类型可能有所不同:要知道,每个数据库都有稍微不同的数据类型,VARCHAR并不意味着所有地方都是相同的。虽然SQL Server有VARCHAR和NVARCHAR,但Apache/DDerby数据库只有VARCHAR,而VARCHAR是Unicode的。

其他回答

我会说,这取决于情况。

如果您开发一个桌面应用程序,其中操作系统以Unicode(与所有当前的Windows系统一样)工作,并且语言本身支持Unicode(默认字符串为Unicode,如Java或C#),那么使用nvarchar。

如果您开发了一个web应用程序,其中字符串以UTF-8形式出现,语言为PHP,而PHP本身仍然不支持Unicode(在5.x版本中),那么varchar可能是一个更好的选择。

nvarchar列可以存储任何Unicode数据。varchar列限制为8位代码页。有些人认为应该使用varchar,因为它占用更少的空间。我认为这不是正确的答案。代码页不兼容性是一个难题,Unicode是解决代码页问题的良方。现在磁盘和内存都很便宜,真的没有理由再浪费时间摆弄代码页了。

所有现代操作系统和开发平台都在内部使用Unicode。通过使用nvarchar而不是varchar,可以避免每次读取或写入数据库时进行编码转换。转换需要时间,而且容易出错。从转换错误中恢复是一个非常重要的问题。

如果您使用的是仅使用ASCII的应用程序,我仍然建议在数据库中使用Unicode。操作系统和数据库排序算法将更好地使用Unicode。Unicode在与其他系统接口时避免了转换问题。你将为未来做准备。您可以始终验证您的数据是否仅限于7位ASCII,无论您要维护的是什么遗留系统,即使您享受完全Unicode存储的一些好处。

Varchar(n)和nvarchar(n)之间的主要区别是:

Varchar(可变长度,非Unicode字符数据)大小最大为8000。

它是可变长度数据类型用于存储非Unicode字符每个字符占用1字节的空间

Nvarchar:可变长度Unicode字符数据。

它是可变长度数据类型用于存储Unicode字符。数据以Unicode编码存储。每一个支持语言。(例如阿拉伯语、德语、印地语等)

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!它避免了限制和依赖性,对存储空间很好,通常对性能也是最好的。