Sql-Server

插入塞爾維亞拉丁文和西里爾文字元

  • April 14, 2014

我正在使用 SQL Server 2012 Express 作為我的asp.net開發工作站的一部分。數據庫和表排序規則設置為Latin1_General_CI_AI. 屬性類型是nvarchar(max)varchar(max)

當我傳遞一個包含塞爾維亞拉丁字元的字元串時žđšćč žđćčžđšćčŽĐŠĆČ,我的應用程序中的模型asp.net按原樣傳遞字元串,但數據庫不接受它,而是寫入ždšcc ždccždšccŽÐŠCC表中。

我也嘗試使用西里爾字元串,但????? ?????已寫入數據庫。

我正在使用MVC5EF6。我沒有參數或數據讀取器。我只是將模型傳遞到框架中,並且EF正在做其他所有事情。

您必須指定要插入寬字元數據:

CREATE TABLE #t (id INT,c1 VARCHAR(MAX),c2 NVARCHAR(MAX));
INSERT INTO #t VALUES(1,'žđšćč žđćčžđšćčŽĐŠĆČ','žđšćč žđćčžđšćčŽĐŠĆČ');
INSERT INTO #t VALUES(2,N'žđšćč žđćčžđšćčŽĐŠĆČ',N'žđšćč žđćčžđšćčŽĐŠĆČ');
SELECT * FROM #t;
DROP TABLE #t;

結果:

只有 id=2 的 c2 列是正確的

我不認為排序規則是您的問題,因為它與排序和排序有關(儘管您以後使用 ORDER BY 等可能會遇到問題),但您提到您有一些VARCHAR欄位。那些不會接受 Unicode 字元(西里爾字母肯定是):他們需要NVARCHAR全程這樣做。

接下來,您如何插入數據?看看這個 SQLFiddle 範例。請注意,塞爾維亞拉丁字元在 VARCHAR 和 NVARCHAR 列中都可以使用(解釋為什麼可以在此 Stack Overflow 文章中找到),但西里爾字元卻不行。另請注意,字元串的前綴是一個N,它將該字元串標識為包含National 字元(2 字節 Unicode,出於所有意圖和目的)。

您需要確保正確聲明列並且字元串帶有前綴,N如果您使用參數或變數,它們也必須是正確的類型。NVARCHAR如果您希望處理標準拉丁字元以外的任何內容,那麼當然通常更容易使用。是的,每個字元需要 2 個字節而不是 1 個字節來儲存,但這是儲存 Unicode 數據必須付出的代價。

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