SQL Server數(shù)據(jù)庫(kù)之 “混合排序規(guī)則環(huán)境”的描述
此文章主要講述的是SQL Server數(shù)據(jù)庫(kù)之 “混合排序規(guī)則環(huán)境”,在實(shí)際操作中你是否遇到過(guò)混合排序規(guī)則環(huán)境這種情況,如果你對(duì)其實(shí)際操作或是其相關(guān)的實(shí)際應(yīng)用有不解之處時(shí),你就可以瀏覽我們的文章了
混合排序規(guī)則環(huán)境
兼容性問(wèn)題對(duì)使用多個(gè)排序規(guī)則存儲(chǔ)數(shù)據(jù)的組織會(huì)有影響。大多數(shù)組織對(duì)所有的 Microsoft® SQL Server數(shù)據(jù)庫(kù)™ 2000 數(shù)據(jù)庫(kù)使用相同的排序規(guī)則,從而消除了所有的排序規(guī)則兼容性問(wèn)題。然而,有些組織存儲(chǔ)的數(shù)據(jù)必須可由使用不同語(yǔ)言的用戶(hù)查看,并且希望盡可能減少排序規(guī)則兼容性問(wèn)題。
所有字符和 Unicode 對(duì)象(如列、變量和常量)都有排序規(guī)則。每當(dāng)使用具有不同排序規(guī)則和代碼頁(yè)的對(duì)象時(shí),都必須對(duì)查詢(xún)進(jìn)行編碼以符合排序規(guī)則類(lèi)型強(qiáng)制規(guī)則。當(dāng)對(duì)使用運(yùn)算符將多個(gè)具有不同排序規(guī)則的簡(jiǎn)單表達(dá)式組合在一起的復(fù)雜表達(dá)式進(jìn)行編碼時(shí),所有排序規(guī)則必須可以隱性轉(zhuǎn)換,或者可以使用 COLLATE 子句顯式轉(zhuǎn)換。
如果沒(méi)有在字符或 Unicode 表達(dá)式中指定排序規(guī)則,則默認(rèn)排序規(guī)則可能因連接的當(dāng)前數(shù)據(jù)庫(kù)設(shè)置而異。例如,如果沒(méi)有在字符或 Unicode 常量上指定 COLLATE 子句,則將給該常量指派當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)排序規(guī)則。這意味著 Transact-SQL 語(yǔ)句的結(jié)果在不同數(shù)據(jù)庫(kù)的上下文中執(zhí)行時(shí)可能有不同的排序規(guī)則。
若設(shè)置復(fù)制,則復(fù)制網(wǎng)絡(luò)(包括發(fā)布服務(wù)器、訂閱服務(wù)器和分發(fā)服務(wù)器)中包括的所有數(shù)據(jù)庫(kù)都必須使用相同的代碼頁(yè)。
大容量復(fù)制函數(shù) BULK INSERT 和 bcp 命令提示實(shí)用工具支持列排序規(guī)則。
盡可能減少排序規(guī)則問(wèn)題
如果必須存儲(chǔ)反映多種語(yǔ)言的字符數(shù)據(jù),始終使用 Unicode nchar、nvarchar 和 ntext 數(shù)據(jù)類(lèi)型(而不是 char、varchar、text 數(shù)據(jù)類(lèi)型)可使排序規(guī)則兼容性問(wèn)題減到最少。使用 Unicode 數(shù)據(jù)類(lèi)型可消除代碼頁(yè)轉(zhuǎn)換問(wèn)題。
對(duì)減少排序規(guī)則兼容性問(wèn)題的另一個(gè)建議是使站點(diǎn)標(biāo)準(zhǔn)化,使之區(qū)分或不區(qū)分大小寫(xiě)和重音字符。若始終選擇對(duì)大小寫(xiě)和重音使用相同敏感性的排序規(guī)則,最終用戶(hù)將在所有系統(tǒng)間體驗(yàn)到一致的行為。大多數(shù) SQL Server 2000 站點(diǎn)選擇不區(qū)分大小寫(xiě)但區(qū)分重音。
大小寫(xiě)敏感性還適用于 SQL Server數(shù)據(jù)庫(kù) 的對(duì)象名;因此,若指定區(qū)分大小寫(xiě)的排序規(guī)則,則所有用戶(hù)在查詢(xún)數(shù)據(jù)庫(kù)時(shí)必須指定正確的大小寫(xiě)。例如,若服務(wù)器區(qū)分大小寫(xiě)并創(chuàng)建一個(gè)名為 Employees 的表,則所有的查詢(xún)都必須將該表引用為 Employees。未使用正確大小寫(xiě)的引用(如 EMPLOYEES 或 employees)將無(wú)效。
排序規(guī)則和 tempdb
每次啟動(dòng) SQL Server 時(shí)都生成 tempdb 數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)與 model 數(shù)據(jù)庫(kù)的默認(rèn)排序規(guī)則相同,后者通常與實(shí)例的默認(rèn)排序規(guī)則相同。如果為創(chuàng)建的用戶(hù)數(shù)據(jù)庫(kù)指定的默認(rèn)排序規(guī)則與 model 的排序規(guī)則不同,則該用戶(hù)數(shù)據(jù)庫(kù)與 tempdb 的默認(rèn)排序規(guī)則也不同。所有的臨時(shí)存儲(chǔ)過(guò)程或臨時(shí)表都創(chuàng)建并存儲(chǔ)在 tempdb 中,這意味著臨時(shí)表中的所有隱性列以及臨時(shí)存儲(chǔ)過(guò)程中的所有類(lèi)型強(qiáng)制默認(rèn)常量、變量和參數(shù)與***表和***存儲(chǔ)過(guò)程中創(chuàng)建的對(duì)等對(duì)象使用不同的排序規(guī)則。
text 數(shù)據(jù)類(lèi)型可能由此產(chǎn)生問(wèn)題。例如,某個(gè) SQL Server 2000 實(shí)例的默認(rèn)排序規(guī)則是 Latin1_General_CS_AS,并且執(zhí)行以下語(yǔ)句:
- CREATE DATABASE TestDB COLLATE Estonian_CS_AS USE TestDB
- CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, TextCol text )
在該系統(tǒng)中,tempdb 數(shù)據(jù)庫(kù)對(duì)代碼頁(yè) 1252 使用 Latin1_General_CS_AS 排序規(guī)則,TestDB 和 TestPermTab.TextCol 對(duì)代碼頁(yè) 1257 使用 Estonian_CS_AS 排序規(guī)則。如果接下來(lái)執(zhí)行:
- 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
若要消除錯(cuò)誤,可使用以下可選方法之一:
在兩個(gè) TextCol 列中使用 Unicode 數(shù)據(jù)類(lèi)型 ntext 而不是 text。
指定臨時(shí)表列使用用戶(hù)數(shù)據(jù)庫(kù)(而不是 tempdb)的默認(rèn)排序規(guī)則。如果系統(tǒng)需要,這將使臨時(shí)表得以在多個(gè)數(shù)據(jù)庫(kù)中使用具有類(lèi)似格式的表。
- CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY,
- TextCol text COLLATE database_default )
指定 #TestTempTab 列的正確排序規(guī)則:
- CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, TextCol text COLLATE Estonian_CS_AS )
BACKUP 和 RESTORE 中的排序規(guī)則
若還原數(shù)據(jù)庫(kù),RESTORE 將使用記錄在備份文件中的源數(shù)據(jù)庫(kù)的排序規(guī)則。還原的數(shù)據(jù)庫(kù)與備份的原始數(shù)據(jù)庫(kù)使用相同的排序規(guī)則。數(shù)據(jù)庫(kù)內(nèi)具有不同排序規(guī)則的個(gè)別對(duì)象仍保留其原來(lái)的排序規(guī)則。即使運(yùn)行還原的實(shí)例與運(yùn)行 BACKUP 的實(shí)例使用不同的默認(rèn)排序規(guī)則,仍能還原數(shù)據(jù)庫(kù)。
若目標(biāo)服務(wù)器上已存在同名數(shù)據(jù)庫(kù),還原備份的***方法是在 RESTORE 語(yǔ)句中指定 REPLACE。若指定 REPLACE,現(xiàn)有的數(shù)據(jù)庫(kù)將由備份文件中的數(shù)據(jù)庫(kù)內(nèi)容完全替換,并且還原數(shù)據(jù)庫(kù)的排序規(guī)則將與備份文件中記錄的排序規(guī)則相同。
若還原日志備份,目的數(shù)據(jù)庫(kù)必須與源數(shù)據(jù)庫(kù)的排序規(guī)則相同。
排序規(guī)則和文本列
若創(chuàng)建的含有 text 列的表所使用的代碼頁(yè)與數(shù)據(jù)庫(kù)默認(rèn)排序規(guī)則的代碼頁(yè)不同,則僅有兩種方法可指定插入列的數(shù)據(jù)值或更新現(xiàn)有值??梢裕?/p>
指定 Unicode 常量。
從另一個(gè)具有相同代碼頁(yè)的列中選擇值。
假設(shè)數(shù)據(jù)庫(kù)和表如下:
- -- 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
以上的相關(guān)內(nèi)容就是對(duì)SQL Server數(shù)據(jù)庫(kù)的 “混合排序規(guī)則環(huán)境”的介紹,望你能有所收獲。
【編輯推薦】
- L Server 2000重建索引的實(shí)際操作流程
- 改善SQL Server安全規(guī)劃的6步驟
- SQL Server 2000文件損壞的修復(fù)方案
- SQL Server 2000優(yōu)化SELECT 語(yǔ)句的方案介紹
- SQL Server處理空值操作中的3大問(wèn)題有哪些?