我在 Windows 2012 R2 生产服务器上预装了一个 MS SQL Server 2012 实例。Windows 区域设置为英语 (EN-US),SQL Server 排序规则为 SQL_Latin1_General_CP1_CI_AS。系统可以很好地处理所有带有 nvarchar 字段的中文数据。
后来出于某种原因(与sql server无关)我可能不得不将Windows 2012 R2服务器的默认系统区域设置更改为中文。这会不会对 SQL Server 实例造成任何不良的副作用?
我在 Windows 2012 R2 生产服务器上预装了一个 MS SQL Server 2012 实例。Windows 区域设置为英语 (EN-US),SQL Server 排序规则为 SQL_Latin1_General_CP1_CI_AS。系统可以很好地处理所有带有 nvarchar 字段的中文数据。
后来出于某种原因(与sql server无关)我可能不得不将Windows 2012 R2服务器的默认系统区域设置更改为中文。这会不会对 SQL Server 实例造成任何不良的副作用?
一般来说,你应该没问题。我知道唯一可能受到影响的区域是 SQLCLR,在这种情况下,必须满足以下条件:
(
操作系统的 LCID 与加载程序集的数据库的默认排序规则的 LCID 不匹配,
或者
加载程序集的数据库的默认排序规则是二进制排序规则,或者是以下各项的任意组合:区分大小写、不区分重音、区分宽度或区分假名类型
),
和
正在使用自定义 SQLCLR 代码
SqlString
正在用作输入参数类型SqlString
参数正在与string
不使用Value
属性或ToString()
方法(即"some string" + SqlStringInputParam;
)的内联连接Regex
。需要明确的是,此问题与加载程序集的数据库的默认排序规则有关,而不是实例/服务器级别的排序规则,甚至与任何字符串列或任何字符串文字或带有排序规则集的变量的排序规则有关
COLLATE
关键字。如果您的数据库的默认排序规则是
SQL_Latin1_General_CP1_CI_AS
因为这是实例级排序规则,那么上面的#1 和#2 都不成立。在这种情况下,如果该数据库中有任何 SQLCLR 代码与上面的第 4 - 6 项匹配,那么您将看不到任何问题。但是,更改操作系统的区域设置会使上面的第 1 项为真,在这种情况下,如果有任何 SQLCLR 代码与上面的第 4 - 6 项匹配,那么该代码将开始抛出“排序规则不匹配”异常。诚然,遇到这种情况的可能性相当低。但是,它已经发生了,所以最好意识到这一点。
如果您更改 Windows 系统区域设置,您的 SQL Server 安装不会发生任何变化,因为它是使用特定排序规则安装的
SQL_Latin1_General_CP1_CI_AS
。