varchar和nvarchar有什么区别?

时间:2020-03-06 14:49:48  来源:igfitidea点击:

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

解决方案

nVarchar将存储Unicode字符。如果要存储本地化数据,这是一种方法。

nvarchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(一种以上的语言),则需要N变体。

varchar:可变长度,非Unicode字符数据。数据库排序规则确定数据使用哪个代码页存储。

nvarchar:可变长度的Unicode字符数据。取决于数据库排序规则进行比较。

掌握了这些知识之后,请使用与输入数据相匹配的任何一种(ASCII v。Unicode)。

我一直使用nvarchar,因为它允许我构建的所有内容都可以承受我向它抛出的几乎所有数据。我的CMS系统偶然使用了中文,因为我使用了nvarchar。如今,任何新的应用程序都不应该真正关心所需的空间量。

你是对的。 nvarchar存储Unicode数据,而varchar存储单字节字符数据。除了存储差异(" nvarchar"需要的存储空间是" varchar"的两倍)(我们已经提到过)之外,首选使用" nvarchar"而不是" varchar"的主要原因是国际化(即以其他语言存储字符串)。

nvarchar列可以存储任何Unicode数据。 varchar列仅限于8位代码页。有人认为应该使用" varchar",因为它占用更少的空间。我相信这不是正确的答案。代码页不兼容是一种痛苦,而Unicode是解决代码页问题的方法。如今,有了便宜的磁盘和内存,实际上没有理由再浪费时间浪费代码页了。

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

如果要与仅使用ASCII的应用程序接口,我仍然建议在数据库中使用Unicode。操作系统和数据库排序算法将与Unicode一起更好地工作。与其他系统接口时,Unicode避免了转换问题。我们将为未来做准备。而且,即使享受完整的Unicode存储的某些优势,我们也始终可以验证对于必须维护的任何旧系统,数据都限制为7位ASCII。

我会说,这要看情况。

如果我们开发一个桌面应用程序,并且该操作系统使用Unicode(像当前所有的Windows系统一样)并且语言本身就支持Unicode(默认字符串是Unicode,例如Java或者C#),那么请使用nvarchar。

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

这取决于Oracle的安装方式。在安装过程中,将设置NLS_CHARACTERSET选项。我们可以通过查询" SELECT value $ FROM sys.props $ WHERE name ='NLS_CHARACTERSET'"来找到它。

如果NLS_CHARACTERSET是Unicode编码(例如UTF8),那就太好了。使用VARCHAR和NVARCHAR几乎相同。现在停止阅读,继续阅读。否则,或者如果我们无法控制Oracle字符集,请继续阅读。

VARCHAR数据以NLS_CHARACTERSET编码存储。如果同一服务器上还有其他数据库实例,则我们可能会受到这些实例的限制;反之亦然,因为我们必须共享设置。这样的字段可以存储可以使用该字符集进行编码的任何数据,而别无其他。因此,例如,如果字符集为MS-1252,则只能存储诸如英文字母,少数带重音符号的字母以及其他几个字母(如和)的字符。应用程序仅对少数地区有用,无法在世界上其他任何地方运行。因此,它被认为是一个坏主意。

NVARCHAR数据以Unicode编码存储。支持每种语言。一个好主意。

那存储空间呢? VARCHAR通常是有效的,因为字符集/编码是针对特定语言环境定制设计的。 NVARCHAR字段以具有讽刺意味的NLS设置为基础,以UTF-8或者UTF-16编码存储。 UTF-8对于"西方"语言非常有效,同时仍支持亚洲语言。 UTF-16对于亚洲语言非常有效,同时仍支持"西方"语言。如果担心存储空间,请选择一个NLS设置以使Oracle适当地使用UTF-8或者UTF-16.

处理速度如何?大多数新的编码平台都本机使用Unicode(Java,.NET,甚至几年前的C ++ std :: wstring!),因此,如果数据库字段为VARCHAR,它将迫使Oracle在每次读取或者写入时在字符集之间进行转换,效果不是很好。使用NVARCHAR避免了转换。

底线:使用NVARCHAR!它避免了限制和依赖性,适合存储空间,并且通常也最适合性能。