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


当前回答

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

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

掌握了这些知识后,使用与输入数据匹配的数据(ASCII与Unicode)。

其他回答

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

这取决于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和非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.

遵循Sql Server VARCHAR和NVARCHAR数据类型之间的差异。在这里,你可以看到一个非常描述性的方式。

一般来说,varchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(多种语言),则需要N变量。

我会说,这取决于情况。

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

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