使用Microsoft SQLServer和Unicode避免代码更改

时间:2008-10-03 14:31:39

标签: sql-server unicode data-migration

如何让MSSQL服务器默认接受Unicode数据到VARCHAR或NVARCHAR列?

我知道你可以通过在字符串前面放置一个N来放置在字段中,但是老实说这在2008年看起来有点陈旧,特别是使用SQL Server 2005。

4 个答案:

答案 0 :(得分:4)

N语法是在SQL Server中指定unicode字符串文字的方法。

N'Unicode string'
'ANSI string'

SQL Server将尽可能使用列的排序规则或数据库的排序规则在两者之间自动转换。

因此,如果您的字符串文字实际上不包含unicode字符,则无需指定N前缀。

但是如果您的字符串文字执行包含unicode字符,则必须使用N前缀。

答案 1 :(得分:2)

如果这是一个Web应用程序,您可能会让您的Web服务器使用UTF8作为其默认编码。这样,来回浏览器的所有数据都是UTF8,可以插入到VARCHAR字段中。 UTF8是一种很好的方法,可以让那些不知道Unicode的应用程序处理它。

答案 2 :(得分:2)

他们真的需要一种方法来关闭对N''前缀的需求。 “它需要向后兼容性”这一论点对我来说毫无意义 - 确保使该行为成为旧应用程序的默认行为,但为我提供了一个默认打开Unicode字符串的选项(即,不需要N''前缀。)我发现当我在Oracle和Postgresql中出现问题时,我需要去处理我的应用程序的大部分内容以适应SQL Server上的Unicode。来吧,微软!

答案 3 :(得分:1)

虽然只要没有进行字符集翻译,您只需将UTF8内容存储在MSSQL Server的VARCHAR字段中,您应该知道:

  1. 您的应用程序之外的任何管理/报告/数据工具都无法理解您的非英语字符。

  2. 语言特定处理(如排序名称列表)可能无法按照每种语言可接受的顺序进行。

  3. 必须注意数据截断。截断多字节UTF8字符通常会导致所涉及角色的数据损坏。如果输入超出字段长度,则应始终拒绝输入。

  4. 它可能不像您想的那样容易禁用字符集转换。即使您在客户端驱动程序中将其关闭,如果在客户端和RDBMS之间存在重要的区域设置差异,在某些情况下它仍然可以被覆盖使用的代码页会立即导致数据损坏。

  5. 如果您认为这就是全部,您将不得不担心自己的愚弄。

  6. 总之,虽然你可能想要沿着这条路走下去并不是一个好主意。进行多字节时需要更改代码。