2012-09-20 53 views
55

我已經將數據庫從mysql遷移到SQL Server(政治),使用UTF8的原始mysql數據庫。SQL Server utf8 howto?

現在我讀https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collation-charset SQL Server 2008不支持utf8,這是個玩笑嗎?

SQL Server承載多個數據庫,主要是拉丁編碼的。由於遷移的數據庫用於Web發佈,我想保留utf8編碼。我是否錯過了某些東西,或者是否需要在應用程序級別進行加密/解密?

+94

+1爲「這是一個笑話」。 ;) – deceze

+1

值得注意的是,Java,JavaScript,DotNet和Windows都在內部使用UTF-16,所以如果您的網站要被編碼,那麼您將保存轉換爲UTF16。 – Ben

+1

如果有幫助,您可以假裝SQL Server內部將文本存儲爲UTF-8;當您檢索它時,驅動程序將其轉換回UTF-16。您還可以假裝SQL Server將文本存儲爲UCS-32。內部存儲格式是不相關的實現細節。重要的是數據庫將Unicode字符數據作爲UTF-16(匹配您的編程環境)。 –

回答

13

不!這可不是說笑。

看一看這裏:即或者是固定的長度,的nchar http://msdn.microsoft.com/en-us/library/ms186939.aspx

字符數據類型,或 可變長度,爲nvarchar,Unicode數據並使用UNICODE UCS-2 字符集。

而且也在這裏:http://en.wikipedia.org/wiki/UTF-16

老UCS-2(2字節通用字符集)是一個由UTF-16在 的Unicode 2.0版本取代了類似的 字符編碼標準在1996年7月。

+0

好的。 mssql客戶端可以轉換到外部的UTF8世界嗎? – Teson

+0

'mssql-client'可以成爲一切。 Java,.NET,C,PHP等...客戶端意味着什麼? – edze

+1

客戶端:php下的sqlsrv擴展。羅伯特說,我明白這裏的文字:http://social.msdn.microsoft.com/Forums/en/sqldriverforphp/thread/e6e506cd-e7f8-42a2-87fb-4e19f8fa9368,將評估和發佈結果。 – Teson

12

UTF-8不是字符集,它是一種編碼。 UTF-8的字符集是Unicode。如果要存儲Unicode文本,請使用nvarchar數據類型。

如果數據庫將使用UTF-8來存儲文本,您仍然不會將文本作爲編碼的UTF-8數據獲取,您可以將其作爲解碼文本輸出。

您可以輕鬆地將UTF-8編碼文本存儲在數據庫中,但不會將其存儲爲文本,而是將其作爲二進制數據(varbinary)存儲。

+0

感謝您的輸入。還有更多的東西要學習,例如http://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf8 – Teson

+0

我無法理解這一點。「角色設置爲UTF8是Unicode「??不是utf8比unicode更寬泛。在unicode和utf8中保存Dauðalogn會得到不同的結果:(EF BB BF)44 61 75 C3 B0 61 6C 6F 67 6E vs \ u0044 \ u0061 \ u0075 \ u00f0 \ u0061c \ u006f \ u0067e – Teson

+2

@ user247245:UTF-8是編碼,Unicode是字符集。UTF-8是一種保存Unicode的方式。您用來表示Unicode的方式是轉義碼在字符串文字中使用,這通常不是如何將Unicode表示爲文件。UTF-32 wo uld是從Uncode到文件格式的最接近的翻譯,其中每個字符代碼被保存爲32位數字。 – Guffa

2

請注意,從Microsoft SQL Server 2016開始,支持UTF-8的是bcp,BULK_INSERTOPENROWSET

附錄2016-12-21:SQL Server 2016 SP1現在爲所有版本的MS SQL(包括Standard和Express)啓用Unicode壓縮(以及大多數其他以前的僅企業功能)。這與UTF-8支持不同,但如果目標是減少西方字母的磁盤空間,它也會帶來類似的好處。