Nói chung, cách tốt nhất là Thay đổi đối chiếu bảng. Tuy nhiên, tôi có một ứng dụng cũ và không thực sự có thể ước tính kết quả liệu điều này có tác dụng phụ hay không. Do đó, tôi đã cố gắng bằng cách nào đó để chuyển đổi chuỗi thành một số định dạng khác để giải quyết vấn đề đối chiếu. Những gì tôi thấy hoạt động là thực hiện so sánh chuỗi bằng cách chuyển đổi các chuỗi thành một biểu diễn thập lục phân của các ký tự của nó. Trên cơ sở dữ liệu, điều này được thực hiện vớiHEX(column).
Đối với PHP, bạn có thể sử dụng chức năng này:
public static function strToHex($string)
{
$hex = '';
for ($i=0; $i<strlen($string); $i++){
$ord = ord($string[$i]);
$hexCode = dechex($ord);
$hex .= substr('0'.$hexCode, -2);
}
return strToUpper($hex);
}
Khi thực hiện truy vấn cơ sở dữ liệu, chuỗi UTF8 ban đầu của bạn phải được chuyển đổi đầu tiên thành một chuỗi iso (ví dụ: sử dụng utf8_decode()
trong PHP) trước khi sử dụng nó trong DB. Do kiểu đối chiếu, cơ sở dữ liệu không thể có các ký tự UTF8 bên trong nên sự kiện so sánh sẽ hoạt động mặc dù điều này thay đổi chuỗi ban đầu (chuyển đổi các ký tự UTF8 không tồn tại thêm vào trong bộ ký tự ISO dẫn đến kết quả là? Hoặc chúng bị loại bỏ hoàn toàn). Chỉ cần đảm bảo rằng khi bạn ghi dữ liệu vào cơ sở dữ liệu, bạn sử dụng cùng một chuyển đổi UTF8 sang ISO.