2011-10-25 89 views
3

我正在使用SQL Server數據庫;數據庫實例編碼是「SQL_Latin1_General_CP1_CI_AS」。SQL Server上的編碼問題

下面的代碼:

UPDATE ... 
SET field = CHAR(136) 
WHERE... 

放入字段中輸入以下代碼:

但是!在Latin1代碼表127-159代碼只是沒有定義!它如何插入這個符號?

而且更重要的是混亂的,當我看到在C#中這個字段值的字符串變量,並將其轉換成char,我得到的代碼710,而不是136

我試着使用編碼轉換:

var latin1Encoding = Encoding.GetEncoding("iso-8859-1"); 
var test = latin1Encoding.GetBytes(field); // field is a string read from db 

但是在這種情況下,我得到了代碼94這是^(看起來相似,但它不一樣,我需要完全相同)。

+2

如果你想要的東西是完全一樣的,我想你應該使用二進制整理。跨不同編碼的轉換始終是有損的。 –

回答

4

但是!在Latin1代碼表127-159代碼只是沒有定義!

在ISO-8859-1中,字符136被定義,但它是一個很少使用和很無意義的控制字符。

但是,儘管名稱爲「Latin1」,但SQL_Latin1_General_CP1_CI_AS不是ISO-8859-1。這是西歐ANSI代碼頁1252,與ISO-8859-1相似,但是在128-159範圍內有一堆不同的符號。

代碼頁1252中的字符136是U + 02C6 MODIFIER LETTER CIRCUMFLEX ACCENT,ˆ;在這種情況下,十進制代碼點數量710

我獲取代碼94是^

是的,你問轉換到ISO-8859-1,其中不包括角色U + 02C6,所以你得到了「最合適的後備」,這是一個看起來有點像你想要的人物。這通常是一件壞事;許多選擇的回退都是非常有問題的。例如,您可以使用EncoderFallback更改此行爲,例如引發異常。

0

好的,這裏有幾個轉換髮生。

  1. 當您使用Char(136)數爲ASCII碼,但由於數量136設置你的字符標準ASCII外面是Windows-1252定義的。那個角色就是旋律。
  2. 除了定義非unicode列的編碼外,排序規則還會在試圖將unicode字符存儲在unicode字段中時,爲非Unicode字符和unicode字符之間的轉換建立一些規則。如果沒有定義轉換,你會得到一個?,但在這種情況下,你得到的字符是unicode代碼點U + 02C6。重要的是值得欣賞的是,排序規則確定了角色之間的等價關係,因爲它們被認爲是相似/相等的。它與實際值無關。
  3. 最後,您使用的是ISO-8859-1編碼,以獲得迴旋的數字碼在編碼,這是94