VARCHAR 列中的日文字元使用 Japanese_Unicode_CI_AS
我正在從 CSV 文件中載入一個帶有日文名稱的表,這些名稱正在變成 SQL 表中的問號。儲存這些值的表是一
varchar
列。我知道該varchar
列不是 Unicode,這就是它將某些字元更改為??
.但是,用日語編寫的現有值如何儲存在
varchar
理想情況下應該儲存在 中nvarchar
?有沒有辦法轉換
nvarchcar
成varchar
?數據庫超出了我們的控制範圍,我們無法更改架構。
正如Tibor 所提到的,由於Windows 程式碼頁 932是雙字節字元集 (DBCS) ,因此
Japanese_Unicode_CI_AS
排序規則(實際上是所有Japanese_*
排序規則)可以將日文字元儲存在列中。我相信只有不到 7800 個日文字元映射到 Windows-932 程式碼頁。但是,Unicode 包含超過 7800 個日文字元。VARCHAR
為了縮小問題範圍,了解一些事情會非常有幫助(甚至可能是必要的):
正是您導入 CSV 文件的方式。您使用的是BCP還是
BULK INSERT
/OPENROWSET(BULK...)
?至少一個日文名稱被轉換為的範例
??
您說“CSV文件中的日文名稱正在變成問號”和“它正在將一些字元更改為
??
”,所以:是所有的日文字元都變成問號,還是只有一部分?
日文字元是變成一個問號 (
?
)、兩個 (??
) 還是各有一個?在不知道這些問題的答案的情況下,我可以說有兩種主要可能性:
- (所有日文字元都導入為
?
):您沒有告訴導入工具 CSV 文件的編碼是什麼。它是否編碼為 Windows-932(或可能是 Windows-31J)?或者它是 Unicode 編碼,例如 UTF-8 或 UTF-16(根據工具可能被列為“UCS-2”或“Unicode”)?如果您使用 BCP,則需要使用-c -C 932
Windows-932 或-c -C 65001
UTF-8 的命令行選項。只需將工具設置為使用正確的程式碼頁即可解決此問題。- (某些日文字元導入為
?
或??
):如果您告訴導入工具文件的正確編碼,則仍有一些日文字元未在 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;
返回:
ヤ :: ? :: ??
只能通過執行以下操作之一來解決此問題:
- 將列的數據類型更改為
NVARCHAR
(儘管您說您不能更改架構)- 更改列的排序規則以使用 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