SQL国家字符(NCHAR)数据types的真正用途是什么?

CHAR (CHARACTER)VARCHAR (CHARACTER VARYING) ,SQL还提供NCHAR (NATIONAL CHARACTER)NVARCHAR (NATIONAL CHARACTER VARYING)types。 在一些数据库中,这是用于字符(非二进制)string的更好的数据types:

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

  • 在Oracle中, NVARCHAR可以存储为UTF-16或UTF-8而不是单字节整理;

  • 但在MySQL中, NVARCHARVARCHAR ,所以没有区别,任何一种types都可以使用UTF-8或任何其他sorting规则进行存储。

那么,如果有的话, NATIONAL实际上在概念上是什么意思呢? 供应商的文档只会告诉你他们自己的DBMS使用什么字符集,而不是实际的基本原理。 与此同时,SQL92标准对function的解释甚至不那么有用,只说明NATIONAL CHARACTER存储在一个实现定义的字符集中。 与存储在实现定义的字符集中的单纯的CHARACTER相反。 这可能是一个不同的实现定义的字符集。 或不。

谢谢,ANSI。 Thansi。

是否应该为所有字符(非二进制)存储目的使用NVARCHAR ? 是否有目前stream行的数据库pipe理系统,它会做一些不可取的事情,或只是不认识关键字(或N''文字)?

本案中的“国家”是指不同国籍的人物。 远东语言特别是有这么多的字符,一个字节没有足够的空间来区分它们。 所以,如果你有一个英文(ascii)的应用程序只有英文字段 ,你可以使用旧的CHAR和VARCHARtypes,每个字符只允许一个字节。

也就是说,大多数情况下你应该使用NCHAR / NVARCHAR。 即使您不认为需要在数据中支持(或潜在地支持)多种语言,即使是仅英文版的应用程序也需要能够合理处理使用外语字符的安全攻击。

在我看来,旧的CHAR / VARCHARtypes仍然是首选的唯一的地方是经常引用ascii的只有内部代码和像Sql Server这样的平台上的数据支持的区别 – 数据将等同于enum像C ++或C#这样的客户端语言。

在Oracle中,数据库字符集可以是多字节字符集,因此您可以在其中存储所有字符的方式….但是您需要正确理解和定义列的长度(使用字节或字符) 。

NVARCHAR使您可以select具有单字节的数据库字符集(这样可以减lessBYTE或CHARACTER大小列之间的混淆)并将NVARCHAR用作多字节。 看到这里 。

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

与此同时,SQL92标准对function的解释甚至不那么有用,只说明NATIONAL CHARACTER存储在一个实现定义的字符集中。 与存储在实现定义的字符集中的单纯的CHARACTER相反。 这可能是一个不同的实现定义的字符集。 或不。

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

是否应该为所有字符(非二进制)存储使用NVARCHAR?

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

是否有目前stream行的数据库pipe理系统,它会做一些不可取的事情

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