SQL国家字符(NCHAR)数据类型的真正含义是什么?

bob*_*nce 50 sql t-sql sql-server oracle nvarchar

和,CHAR (CHARACTER)以及VARCHAR (CHARACTER VARYING),SQL提供NCHAR (NATIONAL CHARACTER)NVARCHAR (NATIONAL CHARACTER VARYING)类型.在某些数据库中,这是用于字符(非二进制)字符串的更好的数据类型:

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

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

  • 但在MySQL,NVARCHARVARCHAR,所以它没有什么区别,任一类型的可以存储使用UTF-8或任何其他排序规则.

那么,NATIONAL实际上在概念上意味着什么呢?供应商的文档仅告诉您自己的DBMS使用哪些字符集,而不是实际的基本原理.与此同时,SQL92标准对该功能的解释更为有帮助,仅说明NATIONAL CHARACTER存储在实现定义的字符集中.而不是仅仅CHARACTER存储在实现定义的字符集中.这可能是一个不同的实现定义的字符集.或不.

谢谢,ANSI.Thansi.

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

Joe*_*orn 14

在这种情况下,"国家"是指不同国籍的特征.远东语言尤其具有如此多的字符,以至于一个字节没有足够的空间来区分它们.因此,如果你有一个英语(ascii)-only应用程序只有英语的字段,你可以使用较旧的CHAR和VARCHAR类型,每个字符只允许一个字节.

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

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

  • 我不同意.在SQL Server中使用nvarchar有很大的性能影响.http://stackoverflow.com/questions/35366/varchar-vs-nvarchar-performance/198753#198753如果您不需要它,请不要使用它... (5认同)
  • 肯定存在性能问题.但我相信正确性问题往往胜过它们 (3认同)

dan*_*n04 5

与此同时,SQL92 标准对该功能的解释甚至没有多少帮助,仅声明 NATIONAL 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 支持

  • 我想到的不仅仅是效率,还有更多不受欢迎的功能或使查询失败的问题,但我认为这是事实!那么您能说出在黑暗时代提出时“CHAR”和“NCHAR”之间的期望区别是什么吗?据我了解,忽略“wchar_t”如何存储在内存中的问题,“wchar_t”的全部目的是提供代码点语义(从那时起当然可能是UTF-16代码单元语义),而“NCHAR”似乎并没有本质上保证代码点、代码单元或字节语义,只是“以某种方式不同”的编码。 (2认同)