Никак не могу разобраться где собака зарыта. опишу по порядку мои действия: Устанавливаю кодировку по умолчанию для моей Бд [sql]alter database base charset utf8;[/sql] Навсякий случай делаю тоде самое для таблицы: [sql] CREATE TABLE `chartest` ( `name` varchar(10) default NULL ) ENGINE=MyISAM CHARACTER SET=utf8 [/sql] В результате в консоли я могу номр видеть русский текст но вот когда осушествляю запрос php вида PHP: <?php $query="SET NAMES utf8"; mysql_query($query, $link) or die('Query failed : ' . mysql_error($link)); $query = "SELECT * FROM chartest"; $result = mysql_query($query, $link) or die('Query failed : ' . mysql_error($link)); while($row = mysql_fetch_array($result)) { echo $row[name]; ?><br><? } Получаю что то вроде "ë®à ¢¯ë" И ещё вопрос везеде рекомендуют использовать кодировку utf8 вместо cp1251 в чём же принципиальное отличие?
OC Windows XP Прастите какой именно скрипт из консоли? Первые две Sql команды выполняются в консоли. Скрипт php на сервере..
HTML: <meta http-equiv="content-type" content="text/html; charset=utf-8"> Файл должен быть сохранён в utf8.
Очень интерестны коментарии знающих людей чтобы обьяснить мне происходящее... и так создаём табличку: [sql] CREATE TABLE `base`.`utf` ( `NAME` VARCHAR( 30 ) NOT NULL ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci [/sql] Далее пишем пхп код: PHP: <?php header('Content-Type: text/html; charset=utf8');// отображать страничку в utf 8 по умолчанию $link = mysql_connect("localhost", "root", "198918") or die("Could not connect : " . mysql_error()); mysql_select_db("BASE") or die("Could not select database"); mysql_query("insert into utf values('Новый текст');",$link) or die('Query failed : ' . mysql_error($link)); $query = "SELECT * FROM utf"; $result = mysql_query($query, $link) or die('Query failed : ' . mysql_error($link)); while($row = mysql_fetch_array($result)) { echo $row[NAME]; ?><br>Текст страницы<br><? } ?> Просматриваем в барузере что у нас получилось меняем кодировку страницы в браузере на ср1251 или меняем header('Content-Type: text/html; charset=utf8'); на header('Content-Type: text/html; charset=ср1251'); получаем Обьсните почему ведь на сколько я понимаю страница должна быть в utf8 Теперь проделаем тоже самое только создадим таблицу в кодировке сp1251 в результате на страничке получаем И снова порос как так? я совсем запутлася...
re привет! у меня стоит winxp я делал так: создавал базу Код (Text): CREATE DATABASE `ttt` CHARACTER SET utf8 COLLATE utf8_general_ci; создавал таблицу Код (Text): CREATE TABLE `users` ( `id` INT( 11 ) NOT NULL AUTO_INCREMENT, `name` CHAR( 30 ) NOT NULL, `age` SMALLINT( 6 ) NOT NULL, PRIMARY KEY( `id` ) ) В скриптах после соединения писал установку кодировки Код (Text): mysql_query"SET NAMES CP1251"; если надо с консоли вывод смотреть, то в консоли mysql пишешь Код (Text): SET NAMES CP866;
lacost так как текст "Текст страницы" стал отображаться корректно после смены кодировки в браузере на ср1251, то делаем вывод, что сам исходник у вас сохранен в этой кодировке. попробуйте в вашем редакторе переконвертировать его в утф8. как только "Текст страницы" будет отображаться в браузере нормально при установленной кодировке утф8, можно будет переходить к базе данных. для начала добавьте в майскл.ини init-connect = "set names utf8" и пробуйте)
messershmitt, спасибо, ваш пример работает и кстати далж возможность работать с данными как в консоли так и в скриптах. iliavlad, спасибо чо подсказали, вы были правы насчтё кодировки странички. Но вот в чём вопросс зачем нам устанавливать кодировку utf8 на БД если потом мы читаем и пишем в неё в кодировке cp1251 или если используем консоль то cp866? и почему при смене кодировки таблицы на ср1251 что казалось бы логичнее снова появляются "?????"
SET NAMES перед записью в базу говорит SQL серверу в какой кодировке ожидать данные. При запросе на выборку SET NAMES указывает в какой кодировке вернуть данные клиенту.
re Я долго искал ответ на этот вопрос но методом тыка у меня получилось то, что я вам написал выше в примере! Я думаю, что дело вот в чем на самом деле! Мои мысли на счет кодировки такие: когда мы создаем базу данных, то по умолчанию там лучше установить кодировку utf8, эта же кодировка переходит и в таблицы базы данных, если не переустановить ее конечно. Кодировка любимой windows cp1251 и занося текст в таблицу, текст соответственно будет туда попадать в кодировке utf8, что потом будет не читабельно в винде, но у меня такое ощущение, что он с удовольствием прочитается в unix и linux системах, таким образом выше правильно написали, что перед занесением текста в таблицу мы из php даем серверу mysql комманду на установку текста в cp1251 текст в базу попадает уже в кодировке ср1251, что при выводе дает нам нормальные русские буковки, а вот с консолью это все из -за dos, там кодировка cp866 и наверное ничего тут сделать нельзя. Это лично мои мысли и если что то не так поправьте, хотелось бы правильно разбираться в этом вопросе!
Я понял о чём вы говорите тоесть текст в таблице назодится в кодировке cp1252 пишим читаем его мы в этой кодировке соотвественно и видим руские буковки но по факту в таблице у нас кодировка uft8 и прочитай мы в кодировке utf8 то увидели бы иероглифы кстаи мы их и увидем если напишем set names utf8 но вот чего я не пойму так это почему нельза установить на таблицу кодировку cp1252 и читать и записываь в неё в этой кодировке и радоваться жизни...но выше я уже приводил пример что будет если так сделать....тоесть на 50% я понимаю как это всё работает но был бы признателен если бы кто то подробно разживал всё эту кашу с кодировками И кстати, messershmitt, ещё рас большое спасибо ща ваш пример я теперь хоть работать могу с русским текстом как в консоли так и с помошью скриптов
Напишу свои соображения по поводу кодировок. 1) Если делаешь проект изначально сам, то лучше всего везде, где можно использовать одну кодировку, желательно utf-8. 2) При передачи данных, откуда-либо куда-либо "приемник" должен знать в какой кодировке данные ему передаются. По поводу "приемника": 2.1 Когда сохраняем скрипт в файл("приемником" является файл), нужно указывать кодировку, в которой мы сохраняем. Если проект состоит из нескольких файлов, то их всех надо сохранять в одной кодировке. Желательно utf-8. Пример: PHP: <?php header("Content-Type: text/html; charset=utf-8"); echo "Русcкий текст"; > Если сохранить этот файл в кодировке utf-8, то в браузере выведется все хорошо. Если сохраним этот файл в win1251 то в браузере скрипт покажет иероглифы. 2.2 Когда передаем клиенту страницу, ("приемником" является браузер), мы сообщаем через заголовок Content-Type: text/html; charset=utf-8 в какой кодировке данные, которые мы передаем. В PHP это делается с помощью функции: PHP: header("Content-Type: text/html; charset=utf-8"); 2.3 Когда записываем данные в базу. Нам нужно указать "приемнику"(базе) в какой кодировке данные мы ей собираемся передавать. При этом не имеет значение в какой кодировке создана таблица, куда мы хотим записать данные. В MYSQL это делается командой SET NAMES "Константа кодировки" В PHP через функцию PHP: mysql_query("SET NAMES utf8"); Т.е. При записи в базу в SET NAMES надо указывать кодировку источника (т.е. скрипта) а не кодировку таблицы. 2.4 При чтении из базы, SET NAMES задает кодировку в которой нам вернет данные MYSQL. И не важно в какой кодировке они хранятся в таблице. Тут "приемником" является скрипт(файл) в котором будете выводить данные из базы.[/php] И в завершении: Если браузер получает заголовок Content-Type: text/html; charset=utf-8 то тег <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> не имеет никакого значения.
РљРѕРґРёСЂРѕРІРєР° mysqlphp В C# используется кодировка Unicode. Чтобы можно было работать с текстовыми файлами, содержащими русские символы, созданными, например, в Блокноте, нужно их перекодировать. Скажем, так: Код:using System.Text;using System.IO;StreamReader stream = new StreamReader"name.txt", Encoding.GetEncoding1251;1251 - номер кодовой страницы.