Как отобразить символы UTF-8 в phpMyAdmin?
У меня есть база данных, правильно настроенная на UTF-8, и я имею дело с базой данных, содержащей японские символы. Если я выберу *... из командной строки MySQL, я правильно вижу японские иероглифы. При извлечении данных из базы данных и отображении их на веб-странице Я вижу их правильно.
однако при просмотре данных таблицы в phpMyAdmin я просто вижу текст мусора. то есть.
ç§ãæ-¥æœæ–™ç†ãŒå¥½ãã§ã 㙀'æ-¥æœæ–™'†ã'...
Как я могу получить phpMyAdmin чтобы отобразить символы на японском языке?
кодировка символов на HTML-странице имеет значение UTF-8.
Edit:
я попробовал экспорт моей базы данных и открыл.sql файл в geany. Символы по-прежнему искажены, даже если кодировка установлена на UTF-8. (Однако выполнение mysqldump базы данных также показывает искаженные символы).
набор символов установлен правильно для базы данных и всех таблиц ('latin' нигде не найден в файле)
CREATE DATABASE `japanese` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Я добавил строки в моей.cnf и перезапущенный mysql, но нет никаких изменений. Я использую Zend Framework для вставки данных в базу данных.
Я собираюсь открыть награду за этот вопрос, так как я действительно хочу это выяснить.
17 ответов:
к сожалению, phpMyAdmin является одним из первых приложений php, которые говорят с MySQL о кодировке правильно. Ваша проблема, скорее всего, связана с тем, что база данных не хранит правильные строки UTF-8 на первом месте.
для правильного отображения символов в phpMyAdmin, данные должны быть правильно сохранены в базе данных. Однако преобразование базы данных в правильный набор символов часто нарушает веб-приложения, которые не знают функцию, связанную с набором символов предоставлено MySQL.
могу я спросить: MySQL > версия 4.1? Для чего нужна база данных в веб-приложении? phpBB? Была ли база данных перенесена из более старой версии веб-приложения или из более старой версии MySQL?
мое предложение-не брат, если веб-приложение, которое вы используете слишком старый и не поддерживается. Только преобразовать базу данных в реальный UTF-8, Если вы уверены, что веб-приложение может читать их правильно.
Edit:
ваш MySQL является > 4.1, это означает, что он поддерживает кодировку. Каковы параметры сортировки кодировки для вашей базы данных? Я уверен, что вы используете
latin1
, который является именем MySQL для ASCII, чтобы сохранить текст UTF-8 в 'байтах', в базу данных.для нечувствительных к кодировке клиентов (т. е. mysql-cli и php-mod-mysql) символы отображаются правильно, так как они передаются в/из базы данных в виде байтов. В phpMyAdmin байты считываются и отображаются как символы ASCII, это текст мусора, который вы казаться.
бесчисленные часы были потрачены много лет назад (2005?) когда MySQL 4.0 устарел, во многих частях Азии. Существует стандартный способ справиться с вашей проблемой и сожрал данные:
- резервное копирование базы данных как
.sql
- откройте его в текстовом редакторе с поддержкой UTF-8, убедитесь, что они выглядят правильно.
- искать
charset collation latin1_general_ci
заменитьlatin1
toutf8
.- Сохранить как новый файл sql, не перезаписывать резервное копирование
- импортируйте новый файл, теперь они будут правильно выглядеть в phpMyAdmin, а японский язык в вашем веб-приложении станет знаками вопроса. Это нормально.
- для вашего php веб-приложения, которые полагаются на php-mod-mysql, вставьте
mysql_query("SET NAMES UTF8");
послеmysql_connect()
, теперь вопросительные знаки исчезнут.добавить следующую конфигурацию
my.ini
для mysql-cli:# CLIENT SECTION [mysql] default-character-set=utf8 # SERVER SECTION [mysqld] default-character-set=utf8
для получения дополнительной информации о кодировке на MySQL, пожалуйста, обратитесь руководство: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html
обратите внимание, что я предполагаю, что ваше веб-приложение использует php-mod-mysql для подключения к базе данных (следовательно,
mysql_connect()
функция), так как php-mod-mysql является единственным расширением, которое я могу придумать, что все еще вызывает проблему по сей день.phpMyAdmin использует php-mod-mysqli для подключения к MySQL. Я никогда не учился его использовать, потому что переключился на фреймворки* для разработки моих php-проектов. Я сильно призываю вас сделать это.
- многие фреймворки, например CodeIgniter, Zend, используют mysqli или pdo для подключения к базам данных. функции mod-mysql считаются устаревшими причиной проблемы производительности и масштабируемости. Кроме того, вы не хотите привязывать свой проект к определенному типу базы данных.
Если вы используете PDO, не забудьте инициировать его с помощью UTF8:
$con = new PDO('mysql:host=' . $server . ';dbname=' . $db . ';charset=UTF8', $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
(просто потратил 5 часов, чтобы понять это, надеюсь, что это сэкономит кому-то драгоценное время...)
Я еще немного погуглил и наткнулся на этой страница
команда, кажется, не имеет смысла, но я все равно попробовал:
в файле / usr/share/phpmyadmin/libraries/dbi / mysqli.дБи.движение за освобождение.php в конце функции
PMA_DBI_connect()
передreturn
заявление я добавил:mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;"); mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;");
и это работает! Теперь я вижу японские символы в phpMyAdmin. WTF? Почему это работает?
У меня была такая же проблема,
установите все параметры сортировки text / varchar в phpMyAdmin в utf-8 и в php-файлы добавьте это:
mysql_set_charset ("utf8", $your_connection_name);
Это решило его для меня.
решение для этого может быть так же просто, как:
- найти функцию/метод подключения phpmysqladmin
- добавить это после подключения базы данных
$db_conect->set_charset('utf8');
вот мой способ, как восстановить данные без рыхлости от latin1 до utf8:
/** * Fixes the data in the database that was inserted into latin1 table using utf8 encoding. * * DO NOT execute "SET NAMES UTF8" after mysql_connect. * Your encoding should be the same as when you firstly inserted the data. * In my case I inserted all my utf8 data into LATIN1 tables. * The data in tables was like ДЕТСКИÐ. * But my page presented the data correctly, without "SET NAMES UTF8" query. * But phpmyadmin did not present it correctly. * So this is hack how to convert your data to the correct UTF8 format. * Execute this code just ONCE! * Don't forget to make backup first! */ public function fixIncorrectUtf8DataInsertedByLatinEncoding() { // mysql_query("SET NAMES LATIN1") or die(mysql_error()); #uncomment this if you already set UTF8 names somewhere // get all tables in the database $tables = array(); $query = mysql_query("SHOW TABLES"); while ($t = mysql_fetch_row($query)) { $tables[] = $t[0]; } // you need to set explicit tables if not all tables in your database are latin1 charset // $tables = array('mytable1', 'mytable2', 'mytable3'); # uncomment this if you want to set explicit tables // duplicate tables, and copy all data from the original tables to the new tables with correct encoding // the hack is that data retrieved in correct format using latin1 names and inserted again utf8 foreach ($tables as $table) { $temptable = $table . '_temp'; mysql_query("CREATE TABLE $temptable LIKE $table") or die(mysql_error()); mysql_query("ALTER TABLE $temptable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysql_error()); $query = mysql_query("SELECT * FROM `$table`") or die(mysql_error()); mysql_query("SET NAMES UTF8") or die(mysql_error()); while ($row = mysql_fetch_row($query)) { $values = implode("', '", $row); mysql_query("INSERT INTO `$temptable` VALUES('$values')") or die(mysql_error()); } mysql_query("SET NAMES LATIN1") or die(mysql_error()); } // drop old tables and rename temporary tables // this actually should work, but it not, then // comment out this lines if this would not work for you and try to rename tables manually with phpmyadmin foreach ($tables as $table) { $temptable = $table . '_temp'; mysql_query("DROP TABLE `$table`") or die(mysql_error()); mysql_query("ALTER TABLE `$temptable` RENAME `$table`") or die(mysql_error()); } // now you data should be correct // change the database character set mysql_query("ALTER DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysql_error()); // now you can use "SET NAMES UTF8" in your project and mysql will use corrected data }
изменить
latin1_swedish_ci
доutf8_general_ci
в phpmyadmin->имя_таблицы->имя_поляЭто где вы найдете его на экране:
во-первых, от клиента do
mysql> SHOW VARIABLES LIKE 'character_set%';
Это даст вам что-то вроде
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
где вы можете проверить общие настройки для клиента, подключения, базы данных
затем вы должны также проверить столбцы, из которых вы извлекаете данные с
SHOW CREATE TABLE TableName
и проверка кодировки и сортировки полей CHAR (хотя обычно люди не устанавливают их явно, но можно дать
CHAR[(length)] [CHARACTER SET charset_name] [COLLATE collation_name]
inCREATE TABLE foo ADD COLUMN foo CHAR ...
)Я считаю, что я перечислил все соответствующие настройки на стороне mysql. Если все еще заблудиться читать нормально docs и, возможно, это вопрос что может пролить некоторый свет (особенно, как я, хотя я получил это право, глядя только на mysql client в первый раз).
phpmyadmin не следует за соединением MySQL, потому что он определяет его правильные параметры сортировки в файле конфигурации phpmyadmin.
поэтому, если мы не хотим или не можем получить доступ к параметрам сервера, мы должны просто заставить его отправлять результаты в другом формате (кодировке), совместимом с клиентом, т. е. phpmyadmin
например, если параметры сортировки соединения MySQL и кодировка MySQL являются utf8, но phpmyadmin является ISO, мы должны просто добавить его перед любым запросом select, отправленным MYSQL через phpmyadmin:
SET SESSION CHARACTER_SET_RESULTS =latin1;
1 - Открыть файл:
C:\wamp\bin\mysql\mysql5.5.24\my.ini
2-найдите запись [mysqld] и добавьте:
character-set-server = utf8 skip-character-set-client-handshake
весь вид должен выглядеть как:
[mysqld] port=3306 character-set-server = utf8 skip-character-set-client-handshake
3-перезапустите службу MySQL!
У меня была точно такая же проблема. База данных кодировка UTF-8 и параметр collation utf8_unicode_ci. Я смог увидеть текст Unicode в своем веб-приложении, но результаты phpMyAdmin и sqldump были искажены.
оказалось, что проблема была в сторону мой веб-приложение подключалось к MySQL. Мне не хватало флага кодировки.
после того, как я исправил это, я смог правильно видеть греческие символы как в phpMyAdmin, так и в sqldump, но потерял все мои предыдущие записи.
его действительно простое, чтобы добавить мультиязычность в myphpadmin если у вас garbdata показывая в myphpadmin, достаточно зайти в myphpadmin выберите вашу базу данных перейти к операции вкладку в эксплуатацию вкладки сортировки см. В разделе установите его в utf8_general_ci, после этого все ваши garbdata будет показывать правильно. простой и легкий трюк
просто раскомментируйте эти строки в libraries / database_interface.движение за освобождение.php
if (! empty($GLOBALS['collation_connection'])) { // PMA_DBI_query("SET CHARACTER SET 'utf8';", $link, PMA_DBI_QUERY_STORE); //PMA_DBI_query("SET collation_connection = '" . //PMA_sqlAddslashes($GLOBALS['collation_connection']) . "';", $link, PMA_DBI_QUERY_STORE); } else { //PMA_DBI_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci';", $link, PMA_DBI_QUERY_STORE); }
Если вы храните данные в utf8 без сохранения кодировки, вам не нужно phpmyadmin для повторного преобразования соединения. Это сработает.
имена функций и файлов не совпадают с именами в новых версиях phpMyAdmin. Вот как исправить в новых PHPMyAdmins:
находим файл:
phpmyadmin/libraries/DatabaseInterface.php
функции:
public function query
сразу после открывающего
{
добавить это:if($link != null){ mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;"); mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;"); }
вот и все. Работает как шарм.