SQL 中的 Unicode 数据类型

Posted

技术标签:

【中文标题】SQL 中的 Unicode 数据类型【英文标题】:Unicode Data Type in SQL 【发布时间】:2012-06-13 12:01:52 【问题描述】:

我是 Microsoft SQL 的新手。我打算将文本存储在 Microsoft SQL 服务器中,并且会有特殊的国际字符。是否有特定于 Unicode 的“数据类型”,或者我最好使用对 unicode 编号的引用来编码我的文本(即 \u0056)

【问题讨论】:

使用 nvarchar 存储 unicode - ***.com/questions/144283/… 【参考方案1】:

使用Nvarchar/Nchar (MSDN link)。曾经也有 Ntext 数据类型,但现在已弃用,取而代之的是 Nvarchar

与非 Unicode 对应的列(charvarchar)相比,这些列占用的空间是其两倍。

然后当“手动”插入它们时,使用N 表示它是 unicode 文本:

INSERT INTO MyTable(SomeNvarcharColumn) 
VALUES (N'français')

【讨论】:

【参考方案2】:

表的字符集特征和其中的字符串是为数据库指定的,如果您的数据库具有 Unicode 排序规则,则表中的字符串是 unicode。对于字符串列,您必须使用nvarcharnchar 数据类型以使它们能够存储Unicode 字符串。但是,如果您的数据库具有 utf8 或 unicode 字符集或排序规则,则此功能有效。阅读此链接以获取更多信息。 Unicode and SQL Server

【讨论】:

链接失效了,有更新的参考资料吗? 这有帮助吗? docs.microsoft.com/en-us/sql/t-sql/data-types/… 这是我读到的。如果您认为它与您的答案相匹配,请编辑它。【参考方案3】:

当您说特殊的国际字符时,您是什么意思?如果特殊意味着它们不常见而只是偶尔出现,那么在您的情况下,在具有大量行或大量索引的表上,nvarchar 的开销可能没有意义。

我完全赞成在适当的情况下使用 Unicode,但理解何时适当很重要。

如果您将数据与不同的隐含代码页(同一数据库中的日文和中文)混合在一起,或者您只是希望国际化和本地化具有前瞻性,那么您希望列是 Unicode 并使用 nvarchar 数据类型,那就是完全没问题。 Unicode 不会神奇地为您解决所有排序问题。

如果您知道您将始终主要存储 ASCII 但偶尔会存储一些外来字符,只需将 UTF-8 数据或 html 编码数据存储在 varchar 中。如果您的数据都是日文和代码页 932(或任何其他单个代码页),您仍然可以在 varchar 中存储双字节字符,它们仍然占用两个字节。我的观点是,当您已经在 DBCS 排序规则中时,国际字符不再是“特殊的”。在查询和其他数据流中处理此类列时,不仅是数据存储,还有任何索引和工作集。

并且不要制定所有字符数据都应该是 nvarchar 的一揽子规则 - 这对于许多作为代码或标识符的列来说是一种浪费。

只要有专栏,请回答相同的问题:

数据的类型是什么?

范围是多少?

是否允许使用 NULL?

大小的限制是多少?

我现在应该应用任何限制来阻止不良数据从一开始就进入吗?

【讨论】:

【参考方案4】:

人们已经成功地使用以下代码在插入数据操作时强制使用 Unicode。

INSERT INTO <table> (text) values (N'<text here>)

1

【讨论】:

以上是关于SQL 中的 Unicode 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server数据类型

SQL Server中的数据类型

是不是只有int,bigint,smallint,tinyint类型的在SQL语句中不用单引号

字典中的数据类型为unicode

如何修复 SymmetricDS 中的 unicode 数据错误

SQL server的数据类型