如何让 MSSQL 服务器默认接受 Unicode 数据到 VARCHAR 或 NVARCHAR 列?
我知道你可以通过在要放置在字段中的字符串前面放置一个 N 来做到这一点,但老实说,这在 2008 年似乎有点过时,尤其是使用 SQL Server 2005。
如何让 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'' 前缀。)我发现我需要去弄乱我的应用程序的大部分区域以适应 SQL Server 上的 Unicode,而这在 Oracle 和 Postgresql 中不是问题。来吧,微软!
虽然您可以简单地将 UTF8 内容存储在 MSSQL Server 的 VARCHAR 字段中,但前提是未完成字符集转换,但您应该注意:
您的应用程序之外的任何管理/报告/数据工具都无法理解您的非英语字符。
特定于语言的处理(例如对名称列表进行排序)可能不会按照每种语言可接受的顺序进行。
必须小心数据截断。截断多字节 UTF8 字符通常会导致相关字符的数据损坏。如果输入超过字段长度,您应该始终拒绝输入。
禁用字符集转换可能不像您想象的那么容易。即使您在客户端驱动程序中将其关闭,如果客户端和使用的 RDBMS 代码页之间存在显着的区域设置差异,它仍然可以在某些情况下被覆盖,这会立即导致数据损坏。
如果您认为这就是全部,您将不得不担心自己自欺欺人。
总而言之,虽然您可能很想走这条路,但它不是一个好主意。多字节时需要更改代码。