SQL Server數據庫之 “混合排序規則環境”的描述
此文章主要講述的是SQL Server數據庫之 “混合排序規則環境”,在實際操作中你是否遇到過混合排序規則環境這種情況,如果你對其實際操作或是其相關的實際應用有不解之處時,你就可以瀏覽我們的文章了
混合排序規則環境
兼容性問題對使用多個排序規則存儲數據的組織會有影響。大多數組織對所有的 Microsoft® SQL Server數據庫™ 2000 數據庫使用相同的排序規則,從而消除了所有的排序規則兼容性問題。然而,有些組織存儲的數據必須可由使用不同語言的用戶查看,并且希望盡可能減少排序規則兼容性問題。
所有字符和 Unicode 對象(如列、變量和常量)都有排序規則。每當使用具有不同排序規則和代碼頁的對象時,都必須對查詢進行編碼以符合排序規則類型強制規則。當對使用運算符將多個具有不同排序規則的簡單表達式組合在一起的復雜表達式進行編碼時,所有排序規則必須可以隱性轉換,或者可以使用 COLLATE 子句顯式轉換。
如果沒有在字符或 Unicode 表達式中指定排序規則,則默認排序規則可能因連接的當前數據庫設置而異。例如,如果沒有在字符或 Unicode 常量上指定 COLLATE 子句,則將給該常量指派當前數據庫的默認排序規則。這意味著 Transact-SQL 語句的結果在不同數據庫的上下文中執行時可能有不同的排序規則。
若設置復制,則復制網絡(包括發布服務器、訂閱服務器和分發服務器)中包括的所有數據庫都必須使用相同的代碼頁。
大容量復制函數 BULK INSERT 和 bcp 命令提示實用工具支持列排序規則。
盡可能減少排序規則問題
如果必須存儲反映多種語言的字符數據,始終使用 Unicode nchar、nvarchar 和 ntext 數據類型(而不是 char、varchar、text 數據類型)可使排序規則兼容性問題減到最少。使用 Unicode 數據類型可消除代碼頁轉換問題。
對減少排序規則兼容性問題的另一個建議是使站點標準化,使之區分或不區分大小寫和重音字符。若始終選擇對大小寫和重音使用相同敏感性的排序規則,最終用戶將在所有系統間體驗到一致的行為。大多數 SQL Server 2000 站點選擇不區分大小寫但區分重音。
大小寫敏感性還適用于 SQL Server數據庫 的對象名;因此,若指定區分大小寫的排序規則,則所有用戶在查詢數據庫時必須指定正確的大小寫。例如,若服務器區分大小寫并創建一個名為 Employees 的表,則所有的查詢都必須將該表引用為 Employees。未使用正確大小寫的引用(如 EMPLOYEES 或 employees)將無效。
排序規則和 tempdb
每次啟動 SQL Server 時都生成 tempdb 數據庫,該數據庫與 model 數據庫的默認排序規則相同,后者通常與實例的默認排序規則相同。如果為創建的用戶數據庫指定的默認排序規則與 model 的排序規則不同,則該用戶數據庫與 tempdb 的默認排序規則也不同。所有的臨時存儲過程或臨時表都創建并存儲在 tempdb 中,這意味著臨時表中的所有隱性列以及臨時存儲過程中的所有類型強制默認常量、變量和參數與***表和***存儲過程中創建的對等對象使用不同的排序規則。
text 數據類型可能由此產生問題。例如,某個 SQL Server 2000 實例的默認排序規則是 Latin1_General_CS_AS,并且執行以下語句:
- CREATE DATABASE TestDB COLLATE Estonian_CS_AS USE TestDB
- CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, TextCol text )
在該系統中,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
以上的相關內容就是對SQL Server數據庫的 “混合排序規則環境”的介紹,望你能有所收獲。
【編輯推薦】
- L Server 2000重建索引的實際操作流程
- 改善SQL Server安全規劃的6步驟
- SQL Server 2000文件損壞的修復方案
- SQL Server 2000優化SELECT 語句的方案介紹
- SQL Server處理空值操作中的3大問題有哪些?