除了CHAR
(CHARACTER)
和VARCHAR
(CHARACTER VARYING)
之外,SQL还提供NCHAR
(NATIONAL CHARACTER)
和NVARCHAR
{{1 }类型。在某些数据库中,这是用于字符(非二进制)字符串的更好的数据类型:
在SQL Server中,(NATIONAL CHARACTER VARYING)
存储为UTF-16LE,是唯一可靠存储非ASCII字符的方法,NCHAR
仅为单字节代码页;
在Oracle中,CHAR
可以存储为UTF-16或UTF-8,而不是单字节整理;
但是在MySQL中,NVARCHAR
是NVARCHAR
,所以它没有区别,任何一种类型都可以用UTF-8或任何其他整理存储。
那么,VARCHAR
实际上在概念上意味着什么呢?供应商的文档仅告诉您自己的DBMS使用哪些字符集,而不是实际的基本原理。与此同时,SQL92标准对该功能的解释更为有帮助,仅说明NATIONAL
存储在实现定义的字符集中。而不仅仅是NATIONAL CHARACTER
,它存储在实现定义的字符集中。这可能是一个不同的实现定义的字符集。或者不是。
谢谢,ANSI。 Thansi。
是否应该将CHARACTER
用于所有字符(非二进制)存储目的?是否有当前流行的DBMS,它会做一些不受欢迎的事情,或者只是不识别关键字(或NVARCHAR
文字)?
答案 0 :(得分:14)
那就是说,大多数时候你应该使用NCHAR / NVARCHAR。即使您认为您不需要在数据中支持(或可能支持)多种语言,即使只有英语的应用程序也需要能够使用外语字符明智地处理安全攻击。
在我看来,关于旧的CHAR / VARCHAR类型仍然是首选的唯一地方是经常引用的ascii-only内部代码和支持区别的Sql Server等平台上的数据 - 这些数据相当于使用C ++或C#等客户端语言的enum
。
答案 1 :(得分:4)
同时SQL92标准解释道 这个功能更没有帮助, 只说明国家字符 存储在实现定义中 字符集。而不仅仅是一个 CHARACTER,存储在 实现定义的字符集。 哪个可能会有所不同 实现定义的字符集。 或者不是。
巧合的是,这与C ++标准在char
和wchar_t
之间的“区别”相同。当每种语言/操作系统组合都有自己的字符集时,字符编码的黑暗时代的遗迹。
是否应该为所有人使用NVARCHAR 字符(非二进制)存储 目的
声明的列类型是VARCHAR
还是NVARCHAR
并不重要。但是,对于所有字符存储目的,使用 Unicode (无论是UTF-8,UTF-16还是UTF-32)非常重要。
当前是否有流行的DBMS 它会做一些不受欢迎的事情
是:在MS SQL Server中,使用NCHAR
会使您的(英语)数据占用两倍的空间。不幸的是,UTF-8 isn't supported yet。
答案 2 :(得分:3)
在Oracle中,数据库字符集可以是多字节字符集,因此您可以在其中存储所有方式的字符....但您需要理解并定义列的长度(在BYTES中)或字符)。
NVARCHAR允许您选择使用单字节数据库字符集(这可以减少BYTE或CHARACTER大小列之间混淆的可能性)并使用NVARCHAR作为多字节。见here。
由于我主要使用英文数据,因此我会使用多字节字符集(主要是UTF-8)作为数据库字符集并忽略NVARCHAR。如果我继承了一个旧的数据库,该数据库是单字节字符集并且太大而无法转换,我可能会使用NVARCHAR。但我不愿意。