IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁數(shù)據(jù)庫MSSQL → SQL Server數(shù)據(jù)庫簡(jiǎn)體繁體數(shù)據(jù)混用的問題

SQL Server數(shù)據(jù)庫簡(jiǎn)體繁體數(shù)據(jù)混用的問題

時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

這篇論壇文章著重介紹了sql server數(shù)據(jù)庫簡(jiǎn)體繁體數(shù)據(jù)混用的問題,詳細(xì)內(nèi)容請(qǐng)參考下文:

我現(xiàn)在要說的是一個(gè)在簡(jiǎn)體繁體數(shù)據(jù)混用的時(shí)候很容易發(fā)生的問題,但是這個(gè)問題也很容易被大家忽略。具體來說,這個(gè)問題會(huì)在所有采用不同排序規(guī)則的數(shù)據(jù)實(shí)例間關(guān)聯(lián)數(shù)據(jù)的時(shí)候發(fā)生。也許我這么說大家還是弄不清楚到底是怎么回事兒,我先來講一下我今天碰到的問題。

公司里面使用的數(shù)據(jù)庫會(huì)有簡(jiǎn)體中文和繁體中文兩種版本。我現(xiàn)在這個(gè)專案使用的SQLServer是繁體中文版的,但是需要使用到另一個(gè)使用簡(jiǎn)體中文版SQLServer專案的數(shù)據(jù),我按照通常的做法把簡(jiǎn)體中文版SQLServer中的一個(gè)數(shù)據(jù)表導(dǎo)入到現(xiàn)在使用的繁體中文版SQLServer中,結(jié)構(gòu)和數(shù)據(jù)都導(dǎo)入成功了。我一開始并沒有意識(shí)到這樣做會(huì)有什么問題。接下來我開始調(diào)試SQL語句,其實(shí)是一個(gè)很簡(jiǎn)單的兩表關(guān)聯(lián)數(shù)據(jù)選擇大致如下:

select table1.*,table2.*

from table1

inner join table2 on table2.FK = table1.PK

照理說這么簡(jiǎn)單的語句沒道理會(huì)出什么問題,不過在查詢分析器里面始終提示如下的錯(cuò)誤


服務(wù)器: 消息 446,級(jí)別 16,狀態(tài) 9,行 1

無法解析 equal to 動(dòng)作的定序衝突。

后來搜索了一下,然后又看了一下T-SQL的幫助,才知道原來是因?yàn)槲覍⒑?jiǎn)體中文SQL Server中的數(shù)據(jù)表導(dǎo)入到繁體中文的數(shù)據(jù)表中的是后,連同原數(shù)據(jù)的排序方式一并導(dǎo)入,導(dǎo)致了簡(jiǎn)體數(shù)據(jù)表的排序方式依然是簡(jiǎn)體,所以無法進(jìn)行比較,從而出錯(cuò)。解決的辦法是指名排序方式,告訴查詢分析器應(yīng)該怎樣排序即可。這里會(huì)需要用到一個(gè)關(guān)鍵字 COLLATE Coliate 在SQLServer聯(lián)機(jī)叢書中是這樣解釋的:

COLLATE

一個(gè)子句,可應(yīng)用于數(shù)據(jù)庫定義或列定義以定義排序規(guī)則,或應(yīng)用于字符串表達(dá)式以應(yīng)用排序規(guī)則投影。

語法:

COLLATE < collation_name >

< collation_name > ::=

{ Windows_collation_name } | { SQL_collation_name }

參數(shù)

collation_name

是應(yīng)用于表達(dá)式、列定義或數(shù)據(jù)庫定義的排序規(guī)則的名稱。collation_name 可以只是指定的 Windows_collation_name 或 SQL_collation_name。

Windows_collation_name

是Windows 排序規(guī)則的排序規(guī)則名稱。請(qǐng)參見Windows排序規(guī)則名稱。

SQL_collation_name

是 SQL 排序規(guī)則的排序規(guī)則名稱。請(qǐng)參見 SQL 排序規(guī)則名稱。

那么我們?cè)趺纯梢灾喇?dāng)前的排序規(guī)則名稱是什么呢,其實(shí)這個(gè)排序規(guī)則名稱是我們?cè)趧?chuàng)建數(shù)據(jù)庫(實(shí)例)的時(shí)候就可以進(jìn)行選擇的,不過通常情況下我們都會(huì)默認(rèn)原來的設(shè)定,不會(huì)對(duì)其進(jìn)行變更,所以如果是簡(jiǎn)體中文的SQLServer就會(huì)默認(rèn)的使用簡(jiǎn)體中文的排序規(guī)則,而如果是繁體中文的SQLServer就會(huì)默認(rèn)的使用繁體中文的排序規(guī)則。我們?cè)诓炜磾?shù)據(jù)庫(實(shí)例)的屬性時(shí),常規(guī)頁簽的最下面一行就是當(dāng)前的排序規(guī)則。在默認(rèn)的情況下,簡(jiǎn)體中文的排序規(guī)則名稱是:Chinese_PRC_CI_AS,而繁體中文的排序規(guī)則名稱則是:Chinese_Taiwan_Stroke_CI_AS,所以我們?nèi)绻谟泻?jiǎn)體繁體排序規(guī)則名稱混用的時(shí)候,只要聲明一下你當(dāng)前要使用哪種排序規(guī)則進(jìn)行比較就可以了,例如針對(duì)上面的那個(gè)SQL語句,下面兩種方法都可以解決那個(gè)錯(cuò)誤提示的問題

以下為引用的內(nèi)容:

SELECT Table1.*,Table2.*

FROM Table1

INNER JOIN Table2 ON Table2.FK = Table1.PK COLLATE Chinese_PRC_CI_AS

SELECT Table1.*,Table2.*

FROM Table1

INNER JOIN Table2 ON Table2.FK = Table1.PK COLLATE Chinese_Taiwan_Stroke_CI_AS

說了半天如何解決排序規(guī)則沖突引起的問題,如果還有興趣的話,下面把SQL Server聯(lián)機(jī)叢書里面關(guān)于排序規(guī)則的概念貼出來給大家分享一下,省得大家再去找:

Microsoft? SQL Server? 2000 支持多種排序規(guī)則。排序規(guī)則對(duì)控制正確使用語言(如馬其頓語或波蘭語)或字母表(如西歐語言使用的拉丁字母表 Latin1_General)字符的規(guī)則進(jìn)行編碼。

每個(gè) SQL Server 排序規(guī)則指定三個(gè)屬性:

用于 Unicode 數(shù)據(jù)類型(nchar、nvarchar 和 ntext)的排序次序。排序次序定義字符的排序序列,以及在比較操作中對(duì)字符取值的方法。
用于非 Unicode 字符數(shù)據(jù)類型(char、varchar 和 text)的排序次序。

用于存儲(chǔ)非 Unicode 字符數(shù)據(jù)的代碼頁。

說明 不能指定與 Unicode 數(shù)據(jù)類型(nchar、nvarchar 和 ntext)對(duì)應(yīng)的代碼頁。用于 Unicode 字符的雙字節(jié)位模式由 Unicode 標(biāo)準(zhǔn)定義且不能更改。

可在任何級(jí)別上指定 SQL Server 2000 排序規(guī)則。安裝 SQL Server 2000 實(shí)例時(shí),可指定該實(shí)例的默認(rèn)排序規(guī)則。每次創(chuàng)建數(shù)據(jù)庫時(shí),可指定用于該數(shù)據(jù)庫的默認(rèn)排序規(guī)則。如果未指定排序規(guī)則,數(shù)據(jù)庫的默認(rèn)排序規(guī)則即是實(shí)例的默認(rèn)排序規(guī)則。無論何時(shí)定義字符列、變量或參數(shù),都可指定這些對(duì)象的排序規(guī)則。如果未指定排序規(guī)則,將使用數(shù)據(jù)庫的默認(rèn)排序規(guī)則創(chuàng)建這些對(duì)象。

如果 SQL Server 實(shí)例的所有用戶都使用同一種語言,則應(yīng)選擇支持該語言的排序規(guī)則。例如,若所有用戶都講法語,則選擇法語排序規(guī)則。

如果 SQL Server 實(shí)例的用戶使用多種語言,則應(yīng)選擇能對(duì)多語種需求提供最佳支持的排序規(guī)則。例如,如果用戶一般都講西歐語言,則選擇 Latin1_General 排序規(guī)則。當(dāng)支持使用多種語言的用戶時(shí),對(duì)所有字符數(shù)據(jù)都使用 Unicode 數(shù)據(jù)類型 nchar、nvarchar 和 ntext 最為重要。Unicode 旨在消除非 Unicode char、varchar 和 text 數(shù)據(jù)類型的代碼頁轉(zhuǎn)換困難。因?yàn)榕判蛞?guī)則定義用于比較操作的排序次序和 Unicode 字符的排序,所以當(dāng)用 Unicode 數(shù)據(jù)類型實(shí)現(xiàn)所有的列時(shí),排序規(guī)則仍會(huì)產(chǎn)生不同。即使當(dāng)使用 Unicode 數(shù)據(jù)類型存儲(chǔ)字符數(shù)據(jù)時(shí),也應(yīng)選擇支持大多數(shù)用戶的排序規(guī)則,以防使用非 Unicode 數(shù)據(jù)類型實(shí)現(xiàn)列或變量。

SQL Server 排序規(guī)則定義數(shù)據(jù)庫引擎存儲(chǔ)和操作字符及 Unicode 數(shù)據(jù)的方式。然而,當(dāng)數(shù)據(jù)移入應(yīng)用程序后,在應(yīng)用程序中進(jìn)行的字符排序和比較將由計(jì)算機(jī)上選定的 Windows 區(qū)域設(shè)置控制。應(yīng)用程序使用的字符數(shù)據(jù)排序規(guī)則是由 Windows 區(qū)域設(shè)置控制的項(xiàng)目之一,區(qū)域設(shè)置還定義其它項(xiàng)目,如數(shù)字、時(shí)間、日期和貨幣格式。對(duì)于 Microsoft Windows NT? 4.0、Microsoft Windows? 98 和 Microsoft Windows 95,可使用控制面板中的"區(qū)域設(shè)置"應(yīng)用程序指定 Windows 區(qū)域設(shè)置。對(duì)于 Microsoft Windows 2000,可使用"控制面板"中的"區(qū)域選項(xiàng)"應(yīng)用程序指定區(qū)域設(shè)置。有關(guān) Windows 區(qū)域設(shè)置的更多信息,請(qǐng)參見 Microsoft Web 站點(diǎn) MSDN? 頁中的 Developing International Software for Windows 95 and Windows NT 4.0。

多個(gè)排序規(guī)則可對(duì)非 Unicode 數(shù)據(jù)使用相同的代碼頁。例如,代碼頁 1251 定義西里爾語字符集。多個(gè)排序規(guī)則(如 Cyrillic_General、Ukrainian 和 Macedonian)都使用該代碼頁。雖然這些排序規(guī)則都使用相同的位集來表示非 Unicode 字符數(shù)據(jù),但在處理字典定義時(shí)所應(yīng)用的排序和比較規(guī)則略有不同,而字典定義確定語言或字母表中與排序規(guī)則相關(guān)的正確字符序列。

因?yàn)镾QL Server 2000排序規(guī)則控制 Unicode 和非 Unicode 排序次序,所以不會(huì)遇到由為 Unicode 和非 Unicode 數(shù)據(jù)指定不同的排序規(guī)則而引起的問題。在 SQL Server 的早期版本中,對(duì)代碼頁號(hào)、字符排序次序和 Unicode 排序規(guī)則分別進(jìn)行指定。SQL Server 的早期版本還支持每個(gè)代碼頁有不同數(shù)目的排序次序,并為某些代碼頁提供 Windows 區(qū)域設(shè)置中沒有的排序次序。在 SQL Server 7.0 中,還可以指定為非 Unicode 數(shù)據(jù)選擇的排序次序以外的其它 Unicode 排序次序。這會(huì)導(dǎo)致在使用與非 Unicode 數(shù)據(jù)相對(duì)的 Unicode 數(shù)據(jù)時(shí),排序和比較操作返回不同的結(jié)果。

關(guān)鍵詞標(biāo)簽:數(shù)據(jù),問題,繁體,簡(jiǎn)體,

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟sql server系統(tǒng)表損壞的解決方法sql server系統(tǒng)表損壞的解決方法MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶Access、SQL Server、Oracle常見應(yīng)用的區(qū)別Access、SQL Server、Oracle常見應(yīng)用的區(qū)別

相關(guān)下載

人氣排行 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫SQL2000數(shù)據(jù)庫遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù)配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改SQL Server 2005降級(jí)到2000的正確操作步驟修改Sql Server唯一約束教程淺談JSP JDBC來連接SQL Server 2005的方法SQL Server創(chuàng)建表語句介紹