54

除了CHAR (CHARACTER)and VARCHAR (CHARACTER VARYING),SQL 还提供了NCHAR (NATIONAL CHARACTER)andNVARCHAR (NATIONAL CHARACTER VARYING)类型。在某些数据库中,这是用于字符(非二进制)字符串的更好数据类型:

  • 在 SQL Server 中,NCHAR以 UTF-16LE 形式存储,并且是可靠存储非 ASCII 字符的唯一方法,仅CHAR作为单字节代码页;

  • 在 Oracle 中,NVARCHAR可能存储为 UTF-16 或 UTF-8 而不是单字节排序规则;

  • 但是在 MySQL 中,NVARCHARisVARCHAR没有区别,任何一种类型都可以使用 UTF-8 或任何其他排序规则存储。

那么,NATIONAL如果有的话,实际上在概念上意味着什么?供应商的文档只告诉您他们自己的 DBMS 使用的字符集,而不是实际的基本原理。同时,SQL92 标准对这个特性的解释更没有帮助,只说明NATIONAL CHARACTER存储在实现定义的字符集中。CHARACTER与存储在实现定义的字符集中的单纯相反。这可能是不同的实现定义的字符集。或不。

谢谢,ANSI。坦西。

是否应该NVARCHAR用于所有字符(非二进制)存储目的?是否有当前流行的 DBMS 会做一些不受欢迎的事情,或者只是不识别关键字(或N''文字)?

4

3 回答 3

15

在这种情况下,“NATIONAL”是指特定于不同国籍的字符。尤其是远东语言的字符太多,以至于一个字节不足以区分它们。因此,如果您有一个仅限英语(ascii)的应用程序或仅限英语的字段,您可以使用旧的 CHAR 和 VARCHAR 类型,每个字符只允许一个字节。

也就是说,大多数时候您应该使用 NCHAR/NVARCHAR。即使您认为不需要在数据中支持(或可能支持)多种语言,即使只有英语的应用程序也需要能够明智地处理使用外语字符的安全攻击。

enum在我看来,唯一仍然首选旧 CHAR/VARCHAR 类型的地方是经常引用的纯 ascii 内部代码和支持区别的 Sql Server 等平台上的数据——数据相当于客户端语言,如 C++ 或 C#。

于 2010-10-09T02:11:45.193 回答
5

同时,SQL92 标准对该特性的解释就更没有帮助了,只说明 NATIONAL CHARACTER 存储在实现定义的字符集中。与单纯的 CHARACTER 不同,CHARACTER 存储在实现定义的字符集中。这可能是不同的实现定义的字符集。或不。

char巧合的是,这与 C++ 标准在和之间做出的“区别”相同wchar_t。当每种语言/操作系统组合都有自己的字符集时,字符编码的黑暗时代的遗迹。

是否应该将 NVARCHAR 用于所有字符(非二进制)存储目的?

您的列的声明类型是 还是 并不VARCHAR重要NVARCHAR。但是对于所有字符存储目的,使用Unicode(无论是 UTF-8、UTF-16 还是 UTF-32)非常重要。

是否有当前流行的 DBMS 会做一些不受欢迎的事情

是:在 MS SQL Server 中,使用NCHAR会使您的(英文)数据占用两倍的空间。 不幸的是,尚不支持 UTF-8。

编辑:SQL Server 2019 终于引入了 UTF-8 支持

于 2010-12-10T04:02:04.123 回答
3

在 Oracle 中,数据库字符集可以是多字节字符集,因此您可以在其中存储各种字符......但是您需要适当地理解和定义列的长度(以 BYTES 或 CHARACTERS 为单位) .

NVARCHAR 使您可以选择拥有一个单字节的数据库字符集(这减少了 BYTE 或 CHARACTER 大小的列之间混淆的可能性)并使用 NVARCHAR 作为多字节。见这里

由于我主要使用英文数据,因此我将使用多字节字符集(主要是 UTF-8)作为数据库字符集并忽略 NVARCHAR。如果我继承了一个单字节字符集中的旧数据库并且太大而无法转换,我可以使用 NVARCHAR。但我宁愿不这样做。

于 2010-10-09T20:52:35.610 回答