Странная проблема с кодировкой MySQL - PullRequest
0 голосов
/ 25 января 2011

У меня есть столбец в таблице страниц с арабскими данными.

Если я сделаю это ...

@mysql_query( "select title from pages where web_id = '$id'" );

Я получу правильные данные на арабском языке.

Но если я снова вызываю ту же функцию, то она фактически находится в цикле, во второй раз она приносит мне ненужные данные.Выглядит примерно так:

"تنظيم الأوقا٠العامة اقرأ قطاع

Кроме того, если до этого запроса я выполняю одно из следующих действий:

@mysql_query("SET NAMES 'utf8'");
@mysql_set_charset( 'utf8' );
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'" );

Я всегда получаю данные мусора, даже при первом вызове.Что здесь происходит?

Обратите внимание, что для сопоставления базы данных, таблицы и поля установлено значение utf8_bin

Ответы [ 2 ]

1 голос
/ 25 января 2011

Несколько случайных подсказок:

Старайтесь не использовать оператор @. Это подавит любое сообщение об ошибке.

Вам необходимо правильно экранировать входные параметры:

mysql_query("SELECT title FROM pages WHERE web_id = '" . mysql_real_escape_string($id) . "'");

Вам необходимо проверить возвращаемое значение mysql_query():

$res = mysql_query("SELECT title FROM pages WHERE web_id = '" . mysql_real_escape_string($id) . "'");
if(!$res){
    die('Could not fetch page title'); // See mysql_error() for error message
}

Убедитесь, что ваш исходный код PHP сохранен как UTF-8. Любой приличный редактор позволит вам сохранить как UTF-8 и отобразит текущую кодировку в строке состояния.

Проверьте определение таблицы. MySQL позволяет устанавливать для каждой таблицы и столбца кодировки.

Установите кодировку соединения с помощью mysql_set_charset().

Убедитесь, что браузер отображает вашу страницу как UTF-8. В PHP вы можете сгенерировать соответствующий заголовок HTTP:

header('Content-Type: text/html; charset=utf-8');
0 голосов
/ 25 января 2011

Вы должны проверить, содержит ли ваше поле данные UTF-8.Даже если он установлен в UTF-8, возможно, вы импортировали данные неправильно или эти данные могут быть повреждены.Вы можете посмотреть на конкретный поток байтов, используя:

SELECT hex(myfield) FROM mytable;

Если вы импортировали данные, вы должны заметить, что файл данных, возможно, был интерпретирован как находящийся в другой кодировке - на самом деле он мог бы даже сделать,Вам нужно убедиться, что файл правильно распознан, например:

mysql --default-character-set=utf8 database < mydbbackup.sql 
...