它只nvarchar
支持多字节字符吗?如果是这种情况,除了存储问题之外,还有什么意义varchars
吗?
一nvarchar
列可以存储任何Unicode数据.甲varchar
柱被限制为一个8位的代码页.有些人认为varchar
应该使用它,因为它占用的空间更少.我相信这不是正确的答案.代码页不兼容性很痛苦,Unicode可以解决代码页问题.现在有了廉价的磁盘和内存,实际上没有理由浪费时间来处理代码页了.
所有现代操作系统和开发平台都在内部使用Unicode.通过使用nvarchar
而不是varchar
,您可以避免每次读取或写入数据库时进行编码转换.转换需要时间,并且容易出错.从转换错误中恢复是一个非常重要的问题.
如果您与仅使用ASCII的应用程序连接,我仍然建议在数据库中使用Unicode.操作系统和数据库整理算法将更好地与Unicode一起使用.Unicode避免了与其他系统连接时的转换问题.你将为未来做准备.您可以随时验证您的数据是否仅限于7位ASCII,以用于您必须维护的任何遗留系统,即使在享受完整Unicode存储的一些优势的同时也是如此.
varchar:可变长度的非Unicode字符数据.数据库排序规则确定使用哪个代码页存储数据.
nvarchar:可变长度的Unicode字符数据.取决于数据库排序规则进行比较.
有了这些知识,请使用与输入数据匹配的任何一种(ASCII v.Unicode).
我总是使用nvarchar,因为它允许我正在构建的任何数据,以承受我投入的任何数据.我的CMS系统偶然会中文,因为我使用的是nvarchar.如今,任何新应用程序都不应该真正关注所需的空间量.
这取决于Oracle的安装方式.在安装过程中,将设置NLS_CHARACTERSET选项.您可以使用查询找到它SELECT value$ 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!它避免了限制和依赖性,适用于存储空间,通常也最适合性能.
nvarchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(多种语言),则需要N变量.
我的两分钱
不使用正确的数据类型时索引可能会失败:
在SQL Server中:当您在VARCHAR列上有索引并为其提供Unicode字符串时,SQL Server不会使用索引.当您将BigInt呈现给包含SmallInt的索引列时,会发生同样的情况.即使BigInt小到可以成为SmallInt,SQL Server也无法使用索引.另一种方法是没有这个问题(当将SmallInt或Ansi-Code提供给索引的BigInt ot NVARCHAR列时).
数据类型可以在不同的DBMS(数据库管理系统)之间变化:
知道每个数据库的数据类型略有不同,而VARCHAR并不意味着在任何地方都是相同的.虽然SQL Server具有VARCHAR和NVARCHAR,但Apache/Derby数据库仅具有VARCHAR,而VARCHAR具有Unicode.
主要是nvarchar存储Unicode字符,varchar存储非Unicode字符.
"Unicodes"意味着16位字符编码方案,允许来自许多其他语言(如阿拉伯语,希伯来语,中文,日语)的字符在单个字符集中编码.
这意味着unicodes每个字符使用2个字节进行存储,非单元只使用每个字符一个字节进行存储.这意味着与非unicode相比,unicodes需要双倍的存储容量.
你是对的.nvarchar
存储Unicode数据,同时varchar
存储单字节字符数据.除了存储差异(nvarchar
需要两倍的存储空间varchar
),您已经提到的,主要原因宁愿nvarchar
在varchar
将国际化(在其他语言中即存储字符串).
我会说,这取决于.
如果您开发一个桌面应用程序,其中操作系统以Unicode工作(如所有当前的Windows系统),并且语言本身支持Unicode(默认字符串是Unicode,如Java或C#),那么请转到nvarchar.
如果您开发一个Web应用程序,其中字符串以UTF-8形式出现,而语言是PHP,它本身仍不支持Unicode(在5.x版本中),那么varchar可能是更好的选择.
nVarchar将帮助您存储Unicode字符.如果要存储本地化数据,这是可行的方法.
虽然NVARCHAR
存储Unicode,但您应该在排序规则的帮助下考虑,您也可以使用VARCHAR
并保存您当地语言的数据.
想象一下以下场景.
您的数据库的排序规则是波斯语,您在VARCHAR(10)
数据类型中保存了类似'علی'(阿里的波斯语写作)的值.没有问题,DBMS只使用三个字节来存储它.
但是,如果要将数据传输到另一个数据库并查看正确的结果,则目标数据库必须具有与此示例中的波斯人目标相同的排序规则.
如果目标归类不同,则会在目标数据库中看到一些问号(?).
最后,请记住,如果您使用的是用于使用本地语言的庞大数据库,我建议使用位置而不是使用太多空格.
我相信设计可能会有所不同.这取决于您所处理的环境.
如果使用单个字节存储字符,则有256种可能的组合,因此您可以保存256个不同的字符.排序规则是定义字符和比较和排序规则的模式.
1252,这是Latin1(ANSI),是最常见的.单字节字符集也不足以存储许多语言使用的所有字符.例如,某些亚洲语言有数千个字符,因此每个字符必须使用两个字节.
当在网络中使用使用多个代码页的系统时,管理通信变得困难.为了标准化,ISO和Unicode联盟引入了Unicode.Unicode使用两个字节来存储每个字符.即可以定义65,536个不同的字符,因此几乎所有字符都可以用Unicode覆盖.如果两台计算机使用Unicode,则每个符号将以相同的方式表示,不需要转换 - 这是Unicode背后的想法.
SQL Server有两类字符数据类型:
非Unicode(char,varchar和text)
Unicode(nchar,nvarchar和ntext)
如果我们需要保存来自多个国家/地区的字符数据,请始终使用Unicode.
我有一个看问题的答案,许多人似乎建议使用nvarchar
过varchar
,因为空间不是一个问题了,所以在启用Unicode进行一些额外的存储没有坏处.嗯,当你想在列上应用索引时,情况并非总是如此.SQL Server对您可以索引的字段大小的限制为900字节.所以,如果你有一个,varchar(900)
你仍然可以索引它,但不是varchar(901)
.使用时nvarchar
,字符数减半,因此您可以索引到最多nvarchar(450)
.因此,如果您确信自己不需要nvarchar
,我建议您不要使用它.
一般来说,在数据库中,我建议坚持你需要的大小,因为你总是可以扩展.例如,一位工作的同事曾经认为使用nvarchar(max)
色谱柱没有任何害处,因为我们对存储没有任何问题.稍后,当我们尝试在此列上应用索引时,SQL Server拒绝了此操作.但是,如果他从均匀开始varchar(5)
,我们可以简单地将其扩展到我们需要的东西,而不会出现需要我们执行现场迁移计划来解决此问题的问题.
Varchar(n)
和之间的主要区别nvarchar(n)
是:
Varchar
(可变长度,非Unicode字符数据)大小最大为8000。1.它是可变长度数据类型
用于存储非Unicode字符
每个字符占用1个字节的空间
Nvarchar
:可变长度Unicode字符数据。
1.这是一个可变长度的数据类型
2.用于存储Unicode字符。
数据以Unicode编码存储。支持每种语言。(例如,阿拉伯语,德语,印地语等语言)
我必须在这里说(我意识到我可能要对自己敞开心!!),但是可以肯定的是,唯一一次NVARCHAR
实际上比所有排序规则都更有用的地方(注意那里更多!)VARCHAR
依赖系统和数据库本身内部是相同的...?如果不是这样,则无论如何都必须进行归类转换,因此它VARCHAR
与一样可行NVARCHAR
。
除此之外,某些数据库系统(例如SQL Server(2012年之前))的页面大小约为。8K。因此,如果您要存储未存储在诸如a TEXT
或NTEXT
field之类的内容中的可搜索数据,则VARCHAR
可以提供全部8k的空间,而NVARCHAR
仅提供4k(双字节,双倍空间)。
概括地说,我想其中之一的使用取决于:
项目或背景
基础设施
数据库系统
遵循Sql Server VARCHAR和NVARCHAR数据类型之间的区别.在这里你可以用一种非常描述的方式看到.
Generalnvarchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(多种语言),则需要N变量.