Sql-Server

在表中儲存日文字元

  • June 16, 2021

我正在使用 SQL Server 2008 R2,並且我想將日文字元儲存在表的一列中。

假設我想儲存日文名稱,我該如何實現?有沒有簡單的方法?

您需要使用orNCHAR(1 - 4000)來儲存從 4001 到超過 1,073,741,822 個字元的任何位置(或者,如果儲存如下所述的任何補充字元,則可能更少)。NVARCHAR``NVARCHAR(1 - 4000)``NVARCHAR(MAX)

從技術上講,如果您使用與程式碼頁 932 關聯的排序規則,則可以在欄位中儲存日文字元。但是,這被認為是一種“傳統”方法,仍然會給您帶來一些問題。處理這個問題的適當方法是使用上面提到的 Unicode 數據類型。有關. _ _VARCHAR``Japanese_*``VARCHAR

您還需要指定日語排序規則,以便數據按預期進行比較和排序。您可以使用以下命令找到可用的日語排序規則:

SELECT * FROM fn_helpcollations() WHERE name LIKE N'Japanese%';

您在欄位規範中使用該值,例如:

CREATE TABLE dbo.test
(
 JapaneseText NVARCHAR(3000) COLLATE Japanese_CI_AS_KS_WS
);

請參閱 MSDN 頁面的以下部分以獲取有關使用排序規則的更多資訊以及CI/ CSAS/ AIKS和中的每一個WS以及BIN/BIN2SC(上面未顯示)的含義:排序規則

並且根據您需要儲存的字元,您可能需要密切注意以SC(即“補充字元”)結尾的排序規則。預設情況下,NCHAR/NVARCHAR數據儲存為UCS-2,這與 非常相似UTF-16,但UCS-2每個字元始終為 2 個字節。另一方面,UTF-16為了支持超過 65,536 個字元(最大大小為 2 個字節,或UInt16.MaxValue+ 1),可以儲存 4 個字節的字元(稱為“代理對”)。有關詳細資訊,請參閱以下有關排序規則和 Unicode 支持(“補充字元”部分)的 MSDN 頁面。


絕對不要使用NTEXT。自 SQL Server 2005 出現以來,這已被棄用!使用它沒有好處/理由,事實上,有幾個缺點。


更新

雖然不理想,但可以將日文字元儲存在CHAR/VARCHAR欄位和變數中。這樣做需要將數據庫的預設排序規則設置為與程式碼頁 932 (Shift-JIS) 關聯的排序規則。您可以通過執行以下查詢找到該排序規則列表:

SELECT col.name
FROM   sys.fn_helpcollations() col
WHERE  COLLATIONPROPERTY(col.name, 'CodePage') = 932;

我通過使用該列表中的條目創建一個數據庫並執行以下語句進行了一個簡單的測試:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation'); -- Japanese_Unicode_CI_AS
SELECT COLLATIONPROPERTY(N'Japanese_Unicode_CI_AS', 'CodePage'); -- 932
SELECT CONVERT(VARCHAR(50), 0x944094B294CD985198EE9AD79AA0); -- 如抜範浪偃壅國
SELECT LEN('如抜範浪偃壅國'), DATALENGTH('如抜範浪偃壅國'); -- 7, 14

這是因為程式碼頁 932 是雙字節字元集 (DBCS),它不同於也是雙字節的 UCS-2 / UTF-16。DBCS 字元集是 8 位編碼中的雙字節字元集(如擴展 ASCII 程式碼頁)。您可以在最後一個查詢中看到,DATALENGTH是字元LENgth的兩倍,並且數據屬於類型,因為字元串文字上VARCHAR沒有前綴,並且是 to ,不是。Windows / SQL Server 支持 4 個 DBCS 程式碼頁:N``CONVERT``VARCHAR``NVARCHAR

  • 932 = 日語(Shift-JIS)
  • 936 = 簡體中文 (GB2312)
  • 949 = 韓語
  • 950 = 繁體中文 (Big5)

僅在絕對需要時才使用它們,例如支持與遺留系統的互動。當然,排序規則仍然可以使用,但將數據儲存在NVARCHAR而不是VARCHAR.

引用自:https://dba.stackexchange.com/questions/90296