使用Microsoft SQLServer和Unicode避免代码更改
-
03-07-2019 - |
题
如何让MSSQL服务器默认接受Unicode数据到VARCHAR或NVARCHAR列?
我知道你可以通过在字符串前面放置一个N来放置在字段中,但是老实说这在2008年看起来有点陈旧,特别是使用SQL Server 2005。
解决方案
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''前缀。)我发现我需要当这不是Oracle和Postgresql中的问题时,去混乱我的应用程序的大部分区域以适应SQL Server上的Unicode。来吧,微软!
虽然只要没有进行字符集翻译,您只需将UTF8内容存储在MSSQL Server的VARCHAR字段中,您应该知道:
-
您的应用程序之外的任何管理/报告/数据工具都无法理解您的非英语字符。
-
语言特定处理(如排序名称列表)可能无法按照每种语言可接受的顺序进行。
-
必须注意数据截断。截断多字节UTF8字符通常会导致所涉及角色的数据损坏。如果输入超出字段长度,则应始终拒绝输入。
-
它可能不像你想的那样容易禁用字符集翻译。即使你在客户端驱动程序中将其关闭它仍然可以在某些情况下覆盖客户端和RDBMS之间存在重大的区域设置差异使用的代码页会立即导致数据损坏。
-
如果您认为这就是全部,您将不得不担心自己的愚弄。
醇>
总之,虽然你可能想要沿着这条路走下去并不是一个好主意。进行多字节时需要更改代码。