【发布时间】:2010-09-15 02:14:43
【问题描述】:
如何让 MSSQL 服务器默认接受 Unicode 数据到 VARCHAR 或 NVARCHAR 列中?
我知道您可以通过在要放置在字段中的字符串前面放置一个 N 来做到这一点,但老实说,这在 2008 年似乎有点过时,尤其是在使用 SQL Server 2005 时。
【问题讨论】:
标签: sql-server unicode data-migration
如何让 MSSQL 服务器默认接受 Unicode 数据到 VARCHAR 或 NVARCHAR 列中?
我知道您可以通过在要放置在字段中的字符串前面放置一个 N 来做到这一点,但老实说,这在 2008 年似乎有点过时,尤其是在使用 SQL Server 2005 时。
【问题讨论】:
标签: sql-server unicode data-migration
N 语法是您在 SQL Server 中指定 unicode 字符串文字的方式。
N'Unicode string'
'ANSI string'
如果可能,SQL Server 将使用列的排序规则或数据库的排序规则在两者之间自动转换。
因此,如果您的字符串文字实际上不包含 unicode 字符,则无需指定 N 前缀。
但如果您的字符串文字 确实 包含 unicode 字符,则必须使用 N 前缀。
【讨论】:
如果这是一个 Web 应用程序,您可能会让您的 Web 服务器使用 UTF8 作为默认编码。这样,所有往返于浏览器的数据都是 UTF8,可以插入到 VARCHAR 字段中。 UTF8 是让不了解 Unicode 的应用程序处理它的好方法。
【讨论】:
他们确实需要一种方法来关闭对 N'' 前缀的需求。 “向后兼容需要它”参数对我来说是零意义 - 当然,将该行为作为旧应用程序的默认行为,但为我提供默认打开 Unicode 字符串的选项(即,不需要 N'' 前缀。)我发现我需要去弄乱我的应用程序的大部分区域以适应 SQL Server 上的 Unicode,而这在 Oracle 和 Postgresql 中不是问题。来吧,微软!
【讨论】:
虽然您可以简单地将 UTF8 内容存储在 MSSQL Server 的 VARCHAR 字段中,但前提是未完成字符集转换,但您应该注意:
您的应用程序之外的任何管理/报告/数据工具都无法理解您的非英语字符。
特定语言的处理(例如对名称列表进行排序)可能不会按照每种语言可接受的顺序进行。
必须小心数据截断。截断多字节 UTF8 字符通常会导致相关字符的数据损坏。如果输入超过字段长度,您应该始终拒绝输入。
禁用字符集转换可能不像您想象的那么简单。即使您在客户端驱动程序中将其关闭,如果客户端和 RDBMS 之间存在显着的区域设置差异,在某些情况下仍可以覆盖它使用的代码页会立即导致数据损坏。
如果您认为这就是全部,您将不得不担心自己会自欺欺人。
总而言之,虽然您可能很想走这条路,但它不是一个好主意。多字节时需要更改代码。
【讨论】: