sql - SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

标签 sql sql-server oracle tsql 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。坦西。

是否应该将 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/

相关文章:

c# - 我如何仅使用 return 获取来自数据库的返回值?

c# - 使用 LINQ to Entities 进行自然排序

SQLPlus 结果在一行

php - 从平面表生成层次结构

sql 按硬编码值排序

sql - 检查 SQL 数据库列中是否存在项目列表的最佳方法?

mysql - 将Mysql数据库迁移到Mssql

java - 如何复制 Liferay 中现有的组织角色并将其添加到已拥有原始角色的用户中?

mysql - JDBC锁: how to tell an exception is caused by lock timeout?

sql - 在 Oracle Sql 查询中获取格式化字符串