Здравствуйте, ув. программисты. У меня существенная проблема, в которой я никак не могу разобраться =( Мне необходимо хранить в БД кирилический текст... SHOW VARIABLES LIKE 'char%' показывает это: Код (Text): Variable_name ----------------- Value character_set_client------------ utf8 character_set_connection ----- utf8 character_set_database ------- utf8 character_set_filesystem ------ binary character_set_results ---------- utf8 character_set_server ---------- latin1 character_set_system --------- utf8 character_sets_dir ------------- /usr/share/mysql/charsets/ вместо необходимой кирилической строки записывается "пустая" строка =( когда речь шла о сохранении имени пользователя воспользовался htmlentities, но сейчас надо записывать комментарии, они содержат куда больше текста, и после конвертации занимают очень много места в БД... (вместо одного символа получается от 4х символов кодировки) можно ли каким-нибудь образом записать кириллицу в БД, если сервер в кодировке latin1 ? чтобы при этом латиница также хранилась... заранее спасибо... с уважением, Дмитрий.
а можно поподробнее? про iconv() почитал. Допустим мне надо сохранить строку: "Привет меня зовут Gennadiy" в БД, а потом вывести её другим скриптом обратно, чтобы она выглядела точно так же (и кирилица и латиница). какие кодировки надо выставить на поля в таблице БД ? скрипт записи: Код (Text): коннект к БД $mystring = "Привет, меня зовут Gennadiy"; $query = "INSERT INTO my_table(str) VALUES ('$mystring')"; mysql_query ($query); а в другом скрипте: Код (Text): коннект к БД $query = "SELECT str FROM my_table"; $res = mysql_query ($query); if (!$res) { exit ("ERROR - query could not be executed!"); } else { $inf = mysql_fetch_array($res); echo "<br>моя строка = ".$inf['str']."<br>"; } запишет ли первый скрипт строку правильно и выведет ли второй скрипт строку в правильной кодировке? напоминаю, что сервер в кодировке "latin1"... заранее спасибо. с ув. Дмитрий
зависит от кодироки данных и типа соединение. Читайте мой первый коммент. Пример использования iconv() $text = iconv('cp1251, 'latin1', $text); Тип соединение выставляется след. образом: mysql_query('SET NAMES latin1'); После получения данных конвертируйте данные обратно, как вам надо, например: $row = mysql_fetch_row($data); $text = $row[0]; echo iconv('latin1', 'cp1251', $text);
Всегда использовал mysql_query("SET NAMES cp121(ну или др кодировка)"); после подключения сразу и проблем не позникало
Огромное спасибо neverlose за подсказку функции iconv()! Единственное, что теперь смущает - это то, что я использую кодировку "ISO-8859-1" Она прописана в input_encoding, output_encoding, internal_encoding в PHP.ini на сервере... этот файл я редактировать не могу, хостер не даёт такой возможности. Я кодирую строку таким образом: Код (Text): $text = iconv("ISO-8859-1","utf-8", $d); записываю её в БД (поля таблицы в "UTF-8"). А потом после извлечения из БД декодирую так: Код (Text): $new_string = iconv("utf-8", "ISO-8859-1", $text); У меня всё отображается нормально. Проверял ещё на нескольких машинах, тоже всё ОК. Подскажите, если я буду кодировать таким образом, будет ли информация правильно отображаться у всех? Мне не очень нравится, что приходится пользоваться "ISO-8859-1"...
input_encoding, output_encoding, internal_encoding Значения этих переменных изменяется вот этим: mysql_query('SET NAMES utf8');
в том то и проблема, что я делаю SET NAMES сразу после коннекта к БД, но значения не меняются =( поэтому работает только так, как я написал в предыдущем ответе!