| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> mssql >> SQL Server數據庫簡體繁體數據混用的問題
 

SQL Server數據庫簡體繁體數據混用的問題

2008-07-22 05:34:14  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  這篇論壇文章著重介紹了SQL Server數據庫簡體繁體數據混用的問題,詳細內容請參考下文:

  我現在要說的是一個在簡體繁體數據混用的時候很容易發生的問題,但是這個問題也很容易被大家忽略。具體來說,這個問題會在所有采用不同排序規則的數據實例間關聯數據的時候發生。也許我這麽說大家還是弄不清楚到底是怎麽回事兒,我先來講一下我今天碰到的問題。

  公司裏面使用的數據庫會有簡體中文和繁體中文兩種版本。我現在這個專案使用的SQLServer是繁體中文版的,但是需要使用到另一個使用簡體中文版SQLServer專案的數據,我按照通常的做法把簡體中文版SQLServer中的一個數據表導入到現在使用的繁體中文版SQLServer中,結構和數據都導入成功了。我一開始並沒有意識到這樣做會有什麽問題。接下來我開始調試SQL語句,其實是一個很簡單的兩表關聯數據選擇大致如下:

  select table1.*,table2.*

  from table1

  inner join table2 on table2.FK = table1.PK

  照理說這麽簡單的語句沒道理會出什麽問題,不過在查詢分析器裏面始終提示如下的錯誤

  服務器: 消息 446,級別 16,狀態 9,行 1

  無法解析 equal to 動作的定序衝突。

  後來搜索了一下,然後又看了一下T-SQL的幫助,才知道原來是因爲我將簡體中文SQL Server中的數據表導入到繁體中文的數據表中的是後,連同原數據的排序方式一並導入,導致了簡體數據表的排序方式依然是簡體,所以無法進行比較,從而出錯。解決的辦法是指名排序方式,告訴查詢分析器應該怎樣排序即可。這裏會需要用到一個關鍵字 COLLATE Coliate 在SQLServer聯機叢書中是這樣解釋的:

  COLLATE

  一個子句,可應用于數據庫定義或列定義以定義排序規則,或應用于字符串表達式以應用排序規則投影。

  語法:

  COLLATE < collation_name >

  < collation_name > ::=

  { Windows_collation_name } | { SQL_collation_name }

  參數

  collation_name

  是應用于表達式、列定義或數據庫定義的排序規則的名稱。collation_name 可以只是指定的 Windows_collation_name 或 SQL_collation_name。

  Windows_collation_name

  是Windows 排序規則的排序規則名稱。請參見Windows排序規則名稱。

  SQL_collation_name

  是 SQL 排序規則的排序規則名稱。請參見 SQL 排序規則名稱。

  那麽我們怎麽可以知道當前的排序規則名稱是什麽呢,其實這個排序規則名稱是我們在創建數據庫(實例)的時候就可以進行選擇的,不過通常情況下我們都會默認原來的設定,不會對其進行變更,所以如果是簡體中文的SQLServer就會默認的使用簡體中文的排序規則,而如果是繁體中文的SQLServer就會默認的使用繁體中文的排序規則。我們在察看數據庫(實例)的屬性時,常規頁簽的最下面一行就是當前的排序規則。在默認的情況下,簡體中文的排序規則名稱是:Chinese_PRC_CI_AS,而繁體中文的排序規則名稱則是:Chinese_Taiwan_Stroke_CI_AS,所以我們如果在有簡體繁體排序規則名稱混用的時候,只要聲明一下你當前要使用哪種排序規則進行比較就可以了,例如針對上面的那個SQL語句,下面兩種方法都可以解決那個錯誤提示的問題

  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

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

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

  每個 SQL Server 排序規則指定三個屬性:

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

  用于非 Unicode 字符數據類型(char、varchar 和 text)的排序次序。

  用于存儲非 Unicode 字符數據的代碼頁。

  說明 不能指定與 Unicode 數據類型(nchar、nvarchar 和 ntext)對應的代碼頁。用于 Unicode 字符的雙字節位模式由 Unicode 標准定義且不能更改。

  可在任何級別上指定 SQL Server 2000 排序規則。安裝 SQL Server 2000 實例時,可指定該實例的默認排序規則。每次創建數據庫時,可指定用于該數據庫的默認排序規則。如果未指定排序規則,數據庫的默認排序規則即是實例的默認排序規則。無論何時定義字符列、變量或參數,都可指定這些對象的排序規則。如果未指定排序規則,將使用數據庫的默認排序規則創建這些對象。

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

  如果 SQL Server 實例的用戶使用多種語言,則應選擇能對多語種需求提供最佳支持的排序規則。例如,如果用戶一般都講西歐語言,則選擇 Latin1_General 排序規則。當支持使用多種語言的用戶時,對所有字符數據都使用 Unicode 數據類型 nchar、nvarchar 和 ntext 最爲重要。Unicode 旨在消除非 Unicode char、varchar 和 text 數據類型的代碼頁轉換困難。因爲排序規則定義用于比較操作的排序次序和 Unicode 字符的排序,所以當用 Unicode 數據類型實現所有的列時,排序規則仍會産生不同。即使當使用 Unicode 數據類型存儲字符數據時,也應選擇支持大多數用戶的排序規則,以防使用非 Unicode 數據類型實現列或變量。

  SQL Server 排序規則定義數據庫引擎存儲和操作字符及 Unicode 數據的方式。然而,當數據移入應用程序後,在應用程序中進行的字符排序和比較將由計算機上選定的 Windows 區域設置控制。應用程序使用的字符數據排序規則是由 Windows 區域設置控制的項目之一,區域設置還定義其它項目,如數字、時間、日期和貨幣格式。對于 Microsoft Windows NT® 4.0、Microsoft Windows® 98 和 Microsoft Windows 95,可使用控制面板中的"區域設置"應用程序指定 Windows 區域設置。對于 Microsoft Windows 2000,可使用"控制面板"中的"區域選項"應用程序指定區域設置。有關 Windows 區域設置的更多信息,請參見 Microsoft Web 站點 MSDN® 頁中的 Developing International Software for Windows 95 and Windows NT 4.0。

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

  因爲SQL Server 2000排序規則控制 Unicode 和非 Unicode 排序次序,所以不會遇到由爲 Unicode 和非 Unicode 數據指定不同的排序規則而引起的問題。在 SQL Server 的早期版本中,對代碼頁號、字符排序次序和 Unicode 排序規則分別進行指定。SQL Server 的早期版本還支持每個代碼頁有不同數目的排序次序,並爲某些代碼頁提供 Windows 區域設置中沒有的排序次序。在 SQL Server 7.0 中,還可以指定爲非 Unicode 數據選擇的排序次序以外的其它 Unicode 排序次序。這會導致在使用與非 Unicode 數據相對的 Unicode 數據時,排序和比較操作返回不同的結果。
 
 
 
上一篇《SQL Server中多行多列連接成爲單行單列》
下一篇《SQL Server開發過程中的的常見問題總結》
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

 
 
 
這篇論壇文章著重介紹了SQL Server數據庫簡體繁體數據混用的問題,詳細內容請參考下文: 我現在要說的是一個在簡體繁體數據混用的時候很容易發生的問題,但是這個問題也很容易被大家忽略。具體來說,這個問題會在所有采用不同排序規則的數據實例間關聯數據的時候發生。也許我這麽說大家還是弄不清楚到底是怎麽回事兒,我先來講一下我今天碰到的問題。 公司裏面使用的數據庫會有簡體中文和繁體中文兩種版本。我現在這個專案使用的SQLServer是繁體中文版的,但是需要使用到另一個使用簡體中文版SQLServer專案的數據,我按照通常的做法把簡體中文版SQLServer中的一個數據表導入到現在使用的繁體中文版SQLServer中,結構和數據都導入成功了。我一開始並沒有意識到這樣做會有什麽問題。接下來我開始調試SQL語句,其實是一個很簡單的兩表關聯數據選擇大致如下: select table1.*,table2.* from table1 inner join table2 on table2.FK = table1.PK 照理說這麽簡單的語句沒道理會出什麽問題,不過在查詢分析器裏面始終提示如下的錯誤 服務器: 消息 446,級別 16,狀態 9,行 1 無法解析 equal to 動作的定序衝突。 後來搜索了一下,然後又看了一下T-SQL的幫助,才知道原來是因爲我將簡體中文SQL Server中的數據表導入到繁體中文的數據表中的是後,連同原數據的排序方式一並導入,導致了簡體數據表的排序方式依然是簡體,所以無法進行比較,從而出錯。解決的辦法是指名排序方式,告訴查詢分析器應該怎樣排序即可。這裏會需要用到一個關鍵字 COLLATE Coliate 在SQLServer聯機叢書中是這樣解釋的: COLLATE 一個子句,可應用于數據庫定義或列定義以定義排序規則,或應用于字符串表達式以應用排序規則投影。 語法: COLLATE < collation_name > < collation_name > ::= { Windows_collation_name } | { SQL_collation_name } 參數 collation_name 是應用于表達式、列定義或數據庫定義的排序規則的名稱。collation_name 可以只是指定的 Windows_collation_name 或 SQL_collation_name。 Windows_collation_name 是Windows 排序規則的排序規則名稱。請參見Windows排序規則名稱。 SQL_collation_name 是 SQL 排序規則的排序規則名稱。請參見 SQL 排序規則名稱。 那麽我們怎麽可以知道當前的排序規則名稱是什麽呢,其實這個排序規則名稱是我們在創建數據庫(實例)的時候就可以進行選擇的,不過通常情況下我們都會默認原來的設定,不會對其進行變更,所以如果是簡體中文的SQLServer就會默認的使用簡體中文的排序規則,而如果是繁體中文的SQLServer就會默認的使用繁體中文的排序規則。我們在察看數據庫(實例)的屬性時,常規頁簽的最下面一行就是當前的排序規則。在默認的情況下,簡體中文的排序規則名稱是:Chinese_PRC_CI_AS,而繁體中文的排序規則名稱則是:Chinese_Taiwan_Stroke_CI_AS,所以我們如果在有簡體繁體排序規則名稱混用的時候,只要聲明一下你當前要使用哪種排序規則進行比較就可以了,例如針對上面的那個SQL語句,下面兩種方法都可以解決那個錯誤提示的問題 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 說了半天如何解決排序規則沖突引起的問題,如果還有興趣的話,下面把SQL Server聯機叢書裏面關于排序規則的概念貼出來給大家分享一下,省得大家再去找: Microsoft® SQL Server™ 2000 支持多種排序規則。排序規則對控制正確使用語言(如馬其頓語或波蘭語)或字母表(如西歐語言使用的拉丁字母表 Latin1_General)字符的規則進行編碼。 每個 SQL Server 排序規則指定三個屬性: 用于 Unicode 數據類型(nchar、nvarchar 和 ntext)的排序次序。排序次序定義字符的排序序列,以及在比較操作中對字符取值的方法。 用于非 Unicode 字符數據類型(char、varchar 和 text)的排序次序。 用于存儲非 Unicode 字符數據的代碼頁。 說明 不能指定與 Unicode 數據類型(nchar、nvarchar 和 ntext)對應的代碼頁。用于 Unicode 字符的雙字節位模式由 Unicode 標准定義且不能更改。 可在任何級別上指定 SQL Server 2000 排序規則。安裝 SQL Server 2000 實例時,可指定該實例的默認排序規則。每次創建數據庫時,可指定用于該數據庫的默認排序規則。如果未指定排序規則,數據庫的默認排序規則即是實例的默認排序規則。無論何時定義字符列、變量或參數,都可指定這些對象的排序規則。如果未指定排序規則,將使用數據庫的默認排序規則創建這些對象。 如果 SQL Server 實例的所有用戶都使用同一種語言,則應選擇支持該語言的排序規則。例如,若所有用戶都講法語,則選擇法語排序規則。 如果 SQL Server 實例的用戶使用多種語言,則應選擇能對多語種需求提供最佳支持的排序規則。例如,如果用戶一般都講西歐語言,則選擇 Latin1_General 排序規則。當支持使用多種語言的用戶時,對所有字符數據都使用 Unicode 數據類型 nchar、nvarchar 和 ntext 最爲重要。Unicode 旨在消除非 Unicode char、varchar 和 text 數據類型的代碼頁轉換困難。因爲排序規則定義用于比較操作的排序次序和 Unicode 字符的排序,所以當用 Unicode 數據類型實現所有的列時,排序規則仍會産生不同。即使當使用 Unicode 數據類型存儲字符數據時,也應選擇支持大多數用戶的排序規則,以防使用非 Unicode 數據類型實現列或變量。 SQL Server 排序規則定義數據庫引擎存儲和操作字符及 Unicode 數據的方式。然而,當數據移入應用程序後,在應用程序中進行的字符排序和比較將由計算機上選定的 Windows 區域設置控制。應用程序使用的字符數據排序規則是由 Windows 區域設置控制的項目之一,區域設置還定義其它項目,如數字、時間、日期和貨幣格式。對于 Microsoft Windows NT® 4.0、Microsoft Windows® 98 和 Microsoft Windows 95,可使用控制面板中的"區域設置"應用程序指定 Windows 區域設置。對于 Microsoft Windows 2000,可使用"控制面板"中的"區域選項"應用程序指定區域設置。有關 Windows 區域設置的更多信息,請參見 Microsoft Web 站點 MSDN® 頁中的 Developing International Software for Windows 95 and Windows NT 4.0。 多個排序規則可對非 Unicode 數據使用相同的代碼頁。例如,代碼頁 1251 定義西裏爾語字符集。多個排序規則(如 Cyrillic_General、Ukrainian 和 Macedonian)都使用該代碼頁。雖然這些排序規則都使用相同的位集來表示非 Unicode 字符數據,但在處理字典定義時所應用的排序和比較規則略有不同,而字典定義確定語言或字母表中與排序規則相關的正確字符序列。 因爲SQL Server 2000排序規則控制 Unicode 和非 Unicode 排序次序,所以不會遇到由爲 Unicode 和非 Unicode 數據指定不同的排序規則而引起的問題。在 SQL Server 的早期版本中,對代碼頁號、字符排序次序和 Unicode 排序規則分別進行指定。SQL Server 的早期版本還支持每個代碼頁有不同數目的排序次序,並爲某些代碼頁提供 Windows 區域設置中沒有的排序次序。在 SQL Server 7.0 中,還可以指定爲非 Unicode 數據選擇的排序次序以外的其它 Unicode 排序次序。這會導致在使用與非 Unicode 數據相對的 Unicode 數據時,排序和比較操作返回不同的結果。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
竹林裏的甜美養眼美女
MM尖尖的下巴
靓麗的草根美女
超靓迷人的大眼睛美女
海南(二)
霧繞三清山
Oldtime
美麗婺源
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有