兼容性问题对使用多个排序规则存储数据的组织会有影响。大多数组织对所有的 Microsoft SQL Server 2000 数据库使用相同的排序规则,从而消除了所有的排序规则兼容性问题。
在该系统中,tempdb 数据库对代码页 1252 使用 Latin1_General_CS_AS 排序规则,TestDB 和 TestPermTab.TextCol 对代码页 1257 使用 Estonian_CS_AS 排序规则。如果接下来执行:
USE TestDB
GO
-- Create a temporary table with the same column declarations
-- as TestPermTab
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, TextCol text )
-- This statement gets an code page conversion not allowed error
-- because the temporary table is created in tempdb, which has a
-- different default collation than TestDB.
INSERT INTO #TestTempTab
SELECT * FROM TestPermTab
GO |
若要消除错误,可使用以下可选方法之一:
在两个 TextCol 列中使用 Unicode 数据类型 ntext 而不是 text。
指定临时表列使用用户数据库(而不是 tempdb)的默认排序规则。如果系统需要,这将使临时表得以在多个数据库中使用具有类似格式的表。
CREATE TABLE #TestTempTab
(PrimaryKey int PRIMARY KEY,
TextCol text COLLATE database_default
)
指定 #TestTempTab 列的正确排序规则:
CREATE TABLE #TestTempTab
(PrimaryKey int PRIMARY KEY,
TextCol text COLLATE Estonian_CS_AS
) |
BACKUP 和 RESTORE 中的排序规则
若还原数据库,RESTORE 将使用记录在备份文件中的源数据库的排序规则。还原的数据库与备份的原始数据库使用相同的排序规则。数据库内具有不同排序规则的个别对象仍保留其原来的排序规则。即使运行还原的实例与运行 BACKUP 的实例使用不同的默认排序规则,仍能还原数据库。
若目标服务器上已存在同名数据库,还原备份的唯一方法是在 RESTORE 语句中指定 REPLACE。若指定 REPLACE,现有的数据库将由备份文件中的数据库内容完全替换,并且还原数据库的排序规则将与备份文件中记录的排序规则相同。
若还原日志备份,目的数据库必须与源数据库的排序规则相同。
排序规则和文本列
若创建的含有 text 列的表所使用的代码页与数据库默认排序规则的代码页不同,则仅有两种方法可指定插入列的数据值或更新现有值。可以:
指定 Unicode 常量。
从另一个具有相同代码页的列中选择值。
假设数据库和表如下:
-- Create a database with a default of code page 1252.
CREATE DATABASE TestDB COLLATE Latin1_General_CS_AS
-- Create a table with a different code page, 1253.
CREATE TABLE TestTab
(PrimaryKey int PRIMARY KEY,
TextCol text COLLATE Greek_CS_AS
)
-- This INSERT statement successfully inserts a Unicode string.
INSERT INTO TestTab VALUES (1, N'abc')
-- This INSERT statement successfully inserts data by selecting
-- from a similarly formatted table in another database that uses
-- uses the Greek 1253 code page as its default.
INSERT INTO TestTab
SELECT * FROM GreekDatabase.dbo.TestTab |