Sql-Server

VARCHAR 列中的日文字元使用 Japanese_Unicode_CI_AS

  • November 24, 2020

我正在從 CSV 文件中載入一個帶有日文名稱的表,這些名稱正在變成 SQL 表中的問號。儲存這些值的表是一varchar列。我知道該varchar列不是 Unicode,這就是它將某些字元更改為??.

但是,用日語編寫的現有值如何儲存在varchar理想情況下應該儲存在 中nvarchar

有沒有辦法轉換nvarchcarvarchar?

數據庫超出了我們的控制範圍,我們無法更改架構。

正如Tibor 所提到的,由於Windows 程式碼頁 932是雙字節字元集 (DBCS) ,因此Japanese_Unicode_CI_AS排序規則(實際上是所有Japanese_*排序規則)可以將日文字元儲存在列中。我相信只有不到 7800 個日文字元映射到 Windows-932 程式碼頁。但是,Unicode 包含超過 7800 個日文字元。VARCHAR

為了縮小問題範圍,了解一些事情會非常有幫助(甚至可能是必要的):

  1. 正是導入 CSV 文件的方式。您使用的是BCP還是BULK INSERT/ OPENROWSET(BULK...)

  2. 至少一個日文名稱被轉換為的範例??

  3. 您說“CSV文件中的日文名稱正在變成問號”和“它正在將一些字元更改為??”,所以:

  4. 所有的日文字元都變成問號,還是只有一部分?

  5. 日文字元是變成一個問號 ( ?)、兩個 ( ??) 還是各有一個?

在不知道這些問題的答案的情況下,我可以說有兩種主要可能性:

  1. (所有日文字元都導入為?):您沒有告訴導入工具 CSV 文件的編碼是什麼。它是否編碼為 Windows-932(或可能是 Windows-31J)?或者它是 Unicode 編碼,例如 UTF-8 或 UTF-16(根據工具可能被列為“UCS-2”或“Unicode”)?如果您使用 BCP,則需要使用-c -C 932Windows-932 或-c -C 65001UTF-8 的命令行選項。只需將工具設置為使用正確的程式碼頁即可解決此問題。
  2. (某些日文字元導入為???):如果您告訴導入工具文件的正確編碼,則仍有一些日文字元未在 Windows-932 程式碼頁中編碼。例如:
-- DROP TABLE ##BCP;
CREATE TABLE ##BCP ([Value] VARCHAR(50) COLLATE Japanese_Unicode_CI_AS);
INSERT INTO ##BCP ([Value]) VALUES (N'ヤ :: ㋾ :: 🈂');
SELECT * FROM ##BCP;

返回:

ヤ :: ? :: ??

只能通過執行以下操作之一來解決此問題:

  1. 將列的數據類型更改為NVARCHAR(儘管您說您不能更改架構)
  2. 更改列的排序規則以使用 UTF-8 排序規則(即以_UTF8; 結尾的排序規則名稱在 SQL Server 2019 中引入)

有關使用排序規則/Unicode/編碼的資訊,請訪問:排序規則資訊

在排序規則和亞洲語言方面,我遠非專家。

但我的猜測是你有一個日文排序規則(例如 Japanese_CI_AS),因為你沒有使用 nvarchar/Unicode,你最終會得到一個雙字節字元集(DBCS)。因此,您的 varchar 列中存在日文字元。

但是當您載入數據時,您的工具(無論您使用什麼來載入數據)都不會在原始碼和放入數據庫的內容之間進行正確的轉換——因此是您的問題。即,您需要深入研究用於載入數據的任何工具的文件,並確保該工具可以正確讀取和解釋 CSV 文件並正確連接到 SQL Server(考慮到您有一個可能是日語的 varchar/ DBCS 排序規則)。

“正確”的做法當然是使用 Unicode/nvarchar,但正如保羅在評論中提到的那樣,我假設你在說“可以”的地方是指“不能”。

此外,我在這裡找到了 Solomon 對這個主題的詳細闡述:Storing Japanese characters in a table

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