2011-06-19 23 views
6

Trước đây tôi sử dụng máy chủ sql 2005 làm cơ sở dữ liệu trang web của mình và mọi thứ hoạt động tốt. bây giờ tôi đã thay đổi thành Máy chủ MySql 5.5 cơ sở dữ liệu vì nó là nguồn mở.Ngoại lệ của MySql: Không thể đặt biến 'character_set_client' thành giá trị 'utf16'

Tôi đã sử dụng Navicat Premium để chuyển dữ liệu của tôi từ máy chủ sql sang mysql. Tôi sử dụng mysql workbench và navicat để quản lý cơ sở dữ liệu của mình. Các vấn đề xảy ra khi tôi khai báo kết nối với cơ sở dữ liệu mysql. đây là mã của tôi:

MySqlCommand cmdselect; 
    MySqlConnection conNDB; 
    MySqlDataReader Mydtr; 
    string server = "localhost"; 
    string database = "maindb"; 
    string uid = "root"; 
    string password = "abc123"; 
    string strCon = "SERVER=" + server + ";" + "DATABASE=" + 
    database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";"; 
    string strSelect = "SELECT * FROM announcement"; 

    conNDB = new MySqlConnection(strCon); 
    conNDB.Open(); 
    cmdselect = new MySqlCommand(strSelect, conNDB); 
    Mydtr = cmdselect.ExecuteReader(); 

    rptAnnounce.DataSource = Mydtr; 
    rptAnnounce.DataBind(); 

    Mydtr.Close(); 
    conNDB.Close(); 

Tham chiếu đến MySql.Data đã được đặt. Ở đây tôi đã nhận thông điệp này lỗi:

Ngoại lệ chi tiết: MySql.Data.MySqlClient.MySqlException: Biến 'character_set_client' không có thể được thiết lập để giá trị của 'UTF16' nhắn Lỗi tuyên bố lỗi này xảy ra trong khi kết nối.Open();

Khi tôi tiếp tục làm mới trang lỗi, đôi khi tôi gặp lỗi khác. đây là nó: Các chi tiết

Ngoại lệ: MySql.Data.MySqlClient.MySqlException: Dự kiến ​​cuối gói dữ liệu Thông báo lỗi cho biết lỗi này xảy ra trong quá Mydtr = cmdselect.ExecuteReader();

Tôi mới dùng mysql. tôi không biết vấn đề này là gì. tôi đoán vấn đề này xuất phát từ cài đặt hoặc dữ liệu của cơ sở dữ liệu, không phải mã nguồn của tôi.

bất kỳ ai biết giải pháp? Giúp đỡ của bạn được đánh giá rất cao. tôi đã cố gắng 4 ngày nhưng không thể giải quyết được.

+0

Bạn có thể vui lòng kiểm tra và cho chúng tôi biết giá trị biến character_set_client của bạn là gì trong cơ sở dữ liệu của bạn, bạn có thể xem nó bằng cách sử dụng truy vấn mysql: HIỂN THỊ BIẾN TỪ "ký tự%" –

+0

hi Etienne Rached, tôi đã kiểm tra^^ là tất cả trong utf8. và tôi đã đăng bài trả lời của bạn trong hướng dẫn của bạn ^^. đây là liên kết: http://www.codeproject.com/Messages/3932728/Re-i-got-some-bugs.aspx –

+0

Tôi gặp phải một vấn đề tương tự và bộ ký tự của tôi là latin1 mà trong những ngày cũ là mặc định . Tôi đã thay đổi thành utf8 trên bảng và các cột trong truy vấn có vấn đề và sự cố đã biến mất. Không chắc chắn lý do tại sao latin1 sẽ gây ra một vấn đề ngoại trừ có thể một số bảng là utf8 và những người khác là latin1 và nó không thích sự pha trộn –

Trả lời

3

giải quyết! ! Nhờ @Etienne Rached và @jeremi

tất cả các sự cố đến từ vấn đề bộ ký tự.

giải pháp: tải xuống navicat, để thay đổi bộ ký tự cho cơ sở dữ liệu và mọi bảng.

có 2 nơi bạn cần kiểm tra:

1) nhấp chuột phải vào cơ sở dữ liệu ví dụ. myDb. Sau đó chọn thuộc tính và đặt ký tự là

2) nhấp chuột phải vào bảng và chọn bảng thiết kế. nhấp vào mỗi hàng đơn lẻ để thay đổi bộ ký tự và cuối cùng chuyển đến tab "Tùy chọn" và thay đổi bộ ký tự.

Để biết thông tin của bạn: đây là trường hợp rất hiếm. Tôi google nó gần như không thể tìm thấy giải pháp. tôi đã tạo lỗi này trong khi cài đặt Mysql, tôi đã chọn định dạng utf16> <

bằng cách này, chuỗi kết nối đơn giản sẽ hoạt động. như

"server=localhost;database=maindb;uid=root;pwd=abc123;CharSet=utf8; port=3306"; 
2

Có thể là bạn đang cố gắng nói chuyện với utf16 nhưng cơ sở dữ liệu chỉ hỗ trợ utf8 hoặc một số khác.

Hãy thử này thêm vào chuỗi kết nối của bạn:

Character Set=utf8 

chuỗi kết nối của tôi trông như thế này:

"server=" + settings.DatabaseHost + 
";User Id=" + settings.DatabaseUsername + 
";password="+ settings.DatabasePassword + 
";database="+ settings.DatabaseName+ 
";Persist Security Info=True" + 
";Connect Timeout=5;Default Command Timeout=10" + 
";Character Set=utf8"; 

Nếu rằng công việc does't, hãy thử ASCII hoặc latin1

+0

Cảm ơn sự giúp đỡ .. Tôi đã thử nó, nhưng tôi nhận được một lỗi khác. tôi đã googled nó. nhưng không thể tìm thấy bất kỳ giải pháp nào cho điều này: Chi tiết ngoại lệ: System.Collections.Generic.KeyNotFoundException: Khóa đã cho không có trong từ điển. –

+0

ý tôi là, khi tôi thêm Ký tự = utf8, tôi nhận được lỗi này: P –

3

Xin chào thêm các điểm trên.

Kể từ phiên bản MySQL 5.5, phiên bản này không hỗ trợ mã hóa bộ ký tự utf16 hoặc utf32.

Có vài điều mà cần phải được xem xét từ cả hai

  1. Khách hàng thực hiện kết nối đến DB
  2. DB tự

Tại phía khách hàng, nó gọi truy vấn DB với truy vấn được mã hóa theo định dạng cụ thể và máy chủ còn nguyên vẹn phải hiểu các truy vấn này và phản hồi theo định dạng cụ thể, mà khách hàng có thể hiểu được lần lượt.

điểm 1: Vì vậy, chúng ta cần phải thiết lập charset ở cấp khách hàng, trong chuỗi kết nối như

Charset=utf8; 

Và đến lượt bạn phải kiểm tra với DB và bảng (mà bạn đang tìm kiếm một truy vấn giao dịch) charset và collation

có bốn mức độ mã hóa charset và collation tại máy chủ MySQL cho linh hoạt

  1. charset cho toàn bộ server_character_set máy chủ
  2. Charset cho Cơ sở dữ liệu
  3. Charset cho Bảng
  4. Charset cho cột Bảng cũng

bạn có thể kiểm tra các giá trị sử dụng sau đây truy vấn

show variables like 'character%'; 
show variables like '%collation%'; 

Vì vậy, điểm là máy chủ DB đọc các truy vấn này trong mã hóa được chỉ định trong chuỗi kết nối.

điểm 2 Thay vì xác định nhân vật đặt ở chuỗi kết nối, bạn cũng có thể thiết lập charset cho khách hàng (trong đó máy chủ ngắt) tại truy vấn sau khi mở kết nối

set names 'charset'; 
Ex: set names 'utf8'; 

Có 3 thông số máy chủ quan trọng trong các vấn đề cụ thể của bộ ký tự từ máy khách đến máy chủ character_set_client - Máy chủ đặt bộ ký tự được chỉ định cho truy vấn của khách hàng được chuyển đến character_set_connection - Máy chủ đặt bộ ký tự được chỉ định cho giao dịch kết nối character_set_results - Serv er đặt charset quy định cho kết quả trả về, thông báo lỗi từ DB cho khách hàng

điểm 3 Thay vì điểm 1 và 2, bạn có thể thiết lập các biến này vào DB để đảm bảo giao dịch máy chủ của khách hàng phù hợp

Về cơ bản, khách hàng và DB (máy chủ, bảng db, cột) mã hóa và loại đối chiếu phải tương tự để tránh mất dữ liệu trong các giao dịch DB.

Hope this helps .....

1

Lỗi này "Ngoại lệ chi tiết: System.Collections.Generic.KeyNotFoundException:" có thể xảy ra nếu bạn chưa nâng cấp thư viện client MySql của bạn sau khi nâng cấp chuỗi ký tự kết nối của bạn thiết lập để utf8mb4

Vui lòng cập nhật phiên bản thư viện MySql.data.dll đến mới nhất 6.6.5.0

Hope nên giải quyết phím này không tìm thấy ngoại lệ.

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