2012-06-15 34 views
5

Tôi biết lỗi này có nghĩa là cột mysql không chấp nhận giá trị, nhưng điều này là lạ, vì giá trị phù hợp trong chuỗi được mã hóa Java UTF-8 và cột mysql là utf8_general_ci. Ngoài ra, tất cả các nhân vật utf8 đều hoạt động tốt cho đến nay, ngoài những điều này.Cách xử lý trạng thái SQL [HY000]; mã lỗi [1366]; Giá trị chuỗi không chính xác?

Trường hợp sử dụng là: Tôi đang nhập tweets. Các tweet trong câu hỏi là: https://twitter.com/bakervin/status/210054214951518212 - bạn có thể thấy hai nhân vật "lạ" (và hai khoảng trống kỳ lạ giữa chúng). Câu hỏi đặt ra là - làm thế nào để xử lý này:

  • cắt những nhân vật này (làm thế nào - đó là họ, làm thế nào để Java UTF-8 khác với MySQL một)
  • làm cho cột có khả năng chấp nhận giá trị này (làm thế nào - có gì khác hơn utf-y hơn utf8_general_ci)

Trả lời

9

Đây có vẻ là unicode surrogate characters. Vì chúng không phải là các ký tự thực tế và có vẻ như MySQL không hỗ trợ chúng, nên an toàn để cắt chúng:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < text.length(); i++) { 
    char ch = text.charAt(i); 
    if (!Character.isHighSurrogate(ch) && !Character.isLowSurrogate(ch)) { 
     sb.append(ch); 
    } 
} 
return sb.toString(); 
Các vấn đề liên quan