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


当前回答

我不得不在这里说(我意识到我可能会打开自己的心扉!),但NVARCHAR确实比VARCHAR更有用(注意更多!)的唯一时间是,所有从属系统上的所有排序规则和数据库本身都是相同的。。。?如果没有,那么无论如何都必须进行排序规则转换,因此VARCHAR和NVARCHAR一样可行。

除此之外,一些数据库系统,如SQL Server(2012年之前)的页面大小约为8K。因此,如果您要存储未保存在TEXT或NTEXT字段中的可搜索数据,那么VARCHAR提供了8k的完整空间,而NVARCHAR仅提供4k(双倍字节,双倍空间)。

总之,我想,两者的使用取决于:

项目或上下文基础设施数据库系统

其他回答

nArchar将帮助您存储Unicode字符。如果您想存储本地化的数据,这是一种方法。

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

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

与varchar相比,nvarchar使用起来是安全的,因为nvarchar也允许unicode字符,所以我们的代码不会出错(类型不匹配)。当我们在SQL Server查询中使用where条件时,如果我们使用的是=运算符,它会多次抛出错误。可能的原因是我们的映射列将在varchar中定义。如果我们在nvarchar中定义它,这个问题就不会发生。尽管如此,我们还是坚持varchar并避免这个问题,我们最好使用LIKE关键字而不是=。