除了 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 中,
NVARCHAR
是VARCHAR
,因此没有区别,任何类型都可以使用 UTF-8 或任何其他排序规则存储。
那么,NATIONAL
在概念上实际上意味着什么(如果有的话)?供应商的文档仅告诉您他们自己的 DBMS 使用的字符集,而不是实际的原理。与此同时,SQL92 标准对该功能的解释甚至没有多少帮助,仅声明 NATIONAL CHARACTER
存储在实现定义的字符集中。与单纯的 CHARACTER
不同,它存储在实现定义的字符集中。这可能是不同的实现定义的字符集。或者不是。
谢谢,ANSI。坦西。
是否应该将 NVARCHAR
用于所有字符(非二进制)存储目的?目前流行的 DBMS 是否会执行一些不需要的操作,或者只是无法识别关键字(或 N''
文字)?
最佳答案
这种情况下的“NATIONAL”是指不同国籍所特有的字符。特别是远东语言的字符数量如此之多,以至于一个字节没有足够的空间来区分它们。因此,如果您有一个仅限英语(ascii)的应用程序或仅限英语的字段,您可以使用旧的 CHAR 和 VARCHAR 类型,它们只允许每个字符一个字节。
也就是说,大多数时候您应该使用 NCHAR/NVARCHAR。即使您认为不需要在数据中支持(或可能支持)多种语言,即使是纯英语应用程序也需要能够明智地处理使用外语字符的安全攻击。
在我看来,旧的 CHAR/VARCHAR 类型仍然受到青睐的唯一地方是经常引用的仅限 ascii 的内部代码和支持这种区别的 Sql Server 等平台上的数据 — 数据相当于C++ 或 C# 等客户端语言中的 enum
。
关于sql - SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3895387/