2009-09-04 39 views
6

Tôi gặp vấn đề với mã hóa. Tôi muốn đưa dữ liệu từ một tệp được mã hóa UTF-8 vào cơ sở dữ liệu SQL Server 2008. SQL Server chỉ có tính năng mã hóa UCS-2, vì vậy tôi đã quyết định chuyển đổi một cách rõ ràng dữ liệu đã truy xuất.Chèn dữ liệu UTF8 vào SQL Server 2008

// connect to page file 
_fsPage = new FileStream(mySettings.filePage, FileMode.Open, FileAccess.Read); 
_streamPage = new StreamReader(_fsPage, System.Text.Encoding.UTF8); 

Đây là thói quen chuyển đổi cho các dữ liệu:

private string ConvertTitle(string title) 
{ 
    string utf8_String = Regex.Replace(Regex.Replace(title, @"\\.", _myEvaluator), @"(?<=[^\\])_", " "); 
    byte[] utf8_bytes = System.Text.Encoding.UTF8.GetBytes(utf8_String); 
    byte[] ucs2_bytes = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.Unicode, utf8_bytes); 
    string ucs2_String = System.Text.Encoding.Unicode.GetString(ucs2_bytes); 

    return ucs2_String; 
} 

Khi bước qua đoạn code cho các chức danh quan trọng, biến chiếc đồng hồ thể hiện các nhân vật chính xác cho cả hai utf-8 và UCS-2 chuỗi. Nhưng trong cơ sở dữ liệu của nó - một phần sai. Một số ký tự đặc biệt được lưu chính xác, những ký tự khác thì không.

  • sai: N trở thành một n
  • Phải: É hoặc é được ví dụ chèn một cách chính xác.

Bất kỳ ý tưởng nào về sự cố và cách giải quyết vấn đề?

thans trước, Frank

Trả lời

6

Tôi nghĩ rằng bạn có một sự hiểu lầm về những gì mã hóa là. Một mã hóa được sử dụng để chuyển đổi một loạt các byte thành một chuỗi ký tự. Một String không có mã hóa được liên kết với nó.

Trong nội bộ, các chuỗi được lưu trữ trong bộ nhớ dưới dạng byte UTF-16LE (đó là lý do Windows tiếp tục gây nhầm lẫn cho mọi người bằng cách gọi mã UTF-16LE là "Unicode"). Nhưng bạn không cần phải biết điều đó - với bạn, chúng chỉ là những chuỗi ký tự.

gì chức năng của bạn làm là:

  1. Mất một chuỗi và chuyển đổi nó sang UTF-8 byte.
  2. Lấy các byte UTF-8 đó và chuyển đổi chúng thành byte UTF-16LE. (Bạn có thể vừa được mã hóa thẳng sang UTF-16LE thay vì UTF-8 ở bước một.)
  3. Lấy các byte UTF-16LE đó và chuyển đổi chúng trở lại thành chuỗi. Điều này cung cấp cho bạn chính xác cùng một chuỗi bạn đã có ở nơi đầu tiên!

Vì vậy, chức năng này không cần thiết; bạn có thể thực sự chỉ cần vượt qua một chuỗi bình thường đến SQL Server từ .NET và không phải lo lắng về nó.

Bit có dấu gạch chéo ngược không làm điều gì đó, có lẽ là ứng dụng cụ thể mà tôi không hiểu nó là gì. Nhưng không có gì trong hàm đó sẽ khiến Windows làm phẳng các ký tự như ń đến n.

Điều gì sẽ xảy ra nếu bạn muốn đặt các ký tự không nằm trong mã hóa riêng của cơ sở dữ liệu trong cơ sở dữ liệu. Có lẽ é là OK vì nhân vật đó là mã hóa mặc định của bạn của cp1252 Tây Âu, nhưng ń không phải như vậy nó bị xáo trộn.

Máy chủ SQL sử dụng 'UCS2' (thực sự là UTF-16LE) để lưu chuỗi Unicode, nhưng bạn đã nói, thường bằng cách sử dụng loại cột QUỐC GIA (NCHAR/NVARCHAR) thay vì CHAR thuần túy.

+0

Yap, công cụ mã hóa/Unicode/UTF này vẫn khiến tôi đau đầu. Dù sao, bạn nhấn móng tay trên đầu. Sau khi thay đổi cột của tôi từ varchar thành nvarchar, ký tự được lưu trữ chính xác. Cảm ơn nhiều! – Aaginor

11

SQL server 2008 xử lý việc chuyển đổi từ UTF-8 vào UCS-2 cho bạn.

Trước tiên hãy đảm bảo rằng các bảng SQL của bạn đang sử dụng các loại dữ liệu nchar, nvarchar cho các cột. Sau đó, bạn cần phải nói cho SQL Server của bạn gửi dữ liệu Unicode bằng cách thêm một N ở phía trước của chuỗi được mã hóa.

INSERT INTO tblTest (test) VALUES (N'EncodedString') 

từ Microsoft http://support.microsoft.com/kb/239530

Xem câu hỏi và giải pháp của tôi ở đây: How do I convert UTF-8 data from Classic asp Form post to UCS-2 for inserting into SQL Server 2008 r2?

+0

cảm ơn bạn rất nhiều. bạn đã thực hiện khoảnh khắc của tôi;) –

0

Đối với độc giả trong tương lai sử dụng phiên bản mới hơn, lưu ý rằng SQL Server 2016 hỗ trợ UTF-8 trong tiện ích bcp của họ.

Các vấn đề liên quan