SQL 国家字符 (NCHAR) 数据类型的真正用途是啥?

Posted

技术标签:

【中文标题】SQL 国家字符 (NCHAR) 数据类型的真正用途是啥?【英文标题】:What's the SQL national character (NCHAR) datatype really for?SQL 国家字符 (NCHAR) 数据类型的真正用途是什么? 【发布时间】:2011-04-23 03:54:42 【问题描述】:

除了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。坦西。

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

【问题讨论】:

SQL Server 以 UCS-2 编码而不是 UTF-16 存储 NVARCHAR:msdn.microsoft.com/en-us/library/… @bobince,“Thansi”是什么意思? Hope this helps. 【参考方案1】:

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

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

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

【讨论】:

我不同意。在 SQL Server 中使用 nvarchar 对性能有很大影响。 ***.com/questions/35366/…不用就别用了…… 肯定存在性能问题。但我相信正确性问题往往胜过它们 正确性将使用所需的数据类型。例如 ISO 货币代码将是 char(3),不需要更多。【参考方案2】:

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

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

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

【讨论】:

即使您正在使用“英文数据”,您通常仍然需要关心非英文字符。人名是“英语”系统中非英语字符的常见示例,但还有其他的。【参考方案3】:

同时SQL92标准解释 该功能甚至没有帮助, 仅说明国家特征 存储在实现定义的 字符集。相对于单纯 CHARACTER,它存储在一个 实现定义的字符集。 这可能是不同的 实现定义的字符集。 或者不。

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

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

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

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

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

编辑:SQL Server 2019 终于introduced UTF-8 support。

【讨论】:

我想的是更多不支持的功能不受欢迎或使查询失败而不是单纯的效率,但我想是真的!那么你能说出在黑暗时代提出CHARNCHAR 之间的理想区别吗?据我了解,忽略 wchar_t 如何存储在内存中的问题,wchar_t 的全部意义在于提供代码点语义(从那时起当然可能是 UTF-16 代码单元语义),而 NCHAR似乎并不能固有地保证代码点、代码单元或字节语义,只是一种“不同的方式”编码。 不仅仅是存储***.com/questions/35366/…

以上是关于SQL 国家字符 (NCHAR) 数据类型的真正用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据类型

Oracle数据类型之nchar

06.SQL Server 数据类型

Oracle基础-数据类型总结

Oracle的N-数据类型困惑

SQL server的数据类型