Как отображать символы UTF-8 в phpMyAdmin?
У меня моя база данных правильно установлена в UTF-8, и я имею дело с базой данных, содержащей японские символы. Если я делаю SELECT *... из командной строки mysql, я правильно вижу японские символы. Когда вы извлекаете данные из базы данных и показываете их на веб-странице, я вижу это правильно.
Однако при просмотре данных таблицы в phpMyAdmin я просто вижу текст мусора. то есть.
ç§ã¯æ- ¥ 本æ- ™ ç † ãŒå ¥ ½ãã§ã ™ ã €, AE- ¥ 本æ- ™ ç † ã,...
Как я могу заставить phpMyAdmin отображать символы на японском языке?
Кодировка символов на странице HTML установлена в UTF-8.
Edit:
Я попытался экспортировать мою базу данных и открыл файл .sql в geany. Символы все еще искажены, даже если кодировка установлена в UTF-8. (Тем не менее, при выполнении mysqldump базы данных также отображаются искаженные символы).
Набор символов установлен правильно для базы данных и всех таблиц ( "latin" не найден нигде в файле)
CREATE DATABASE `japanese` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Я добавил строки в my.cnf и перезапустил mysql, но изменений нет. Я использую Zend Framework для вставки данных в базу данных.
Я собираюсь открыть щедрость для этого вопроса, поскольку я действительно хочу это понять.
Ответы
Ответ 1
Я сделал немного больше поисковых запросов и наткнулся на эту страницу
Команда не имеет смысла, но я все равно пробовал:
В файле /usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.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? Почему это работает?
Ответ 2
К сожалению, phpMyAdmin является одним из первых приложений php, которые правильно говорят с MySQL о кодировке. Ваша проблема, скорее всего, связана с тем, что база данных не сохраняет правильные строки UTF-8 на первом месте.
Чтобы правильно отобразить символы в phpMyAdmin, данные должны быть правильно сохранены в базе данных. Однако преобразование базы данных в правильную кодировку часто прерывает веб-приложения, которые не знают о компонентах, связанных с кодировкой, предоставляемых MySQL.
Могу ли я спросить: есть ли MySQL > версия 4.1? Для чего веб-приложение является базой данных? PHPBB? Была ли база данных перенесена из старой версии веб-приложения или более старой версии MySQL?
Мое предложение не для брата, если используемое вами веб-приложение слишком устарело и не поддерживается. Только конвертируйте базу данных в реальный UTF-8, если вы уверены, что веб-приложение может их правильно прочитать.
Изменить:
Ваш MySQL составляет > 4.1, это означает, что он кодируется. Какие настройки сортировки набора символов для вашей базы данных? Я уверен, что вы используете latin1
, который является именем MySQL для ASCII, для хранения текста UTF-8 в байтах в базе данных.
Для клиентов, нечувствительных к кодировке (т.е. mysql-cli и php-mod-mysql), символы отображаются правильно, поскольку они передаются в/из базы данных в виде байтов. В phpMyAdmin байты считываются и отображаются в виде символов ASCII, что вы видите текст мусора.
Сколько часов было потрачено много лет назад (2005?), когда MySQL 4.0 устарел, во многих частях Азии. Существует стандартный способ справиться с вашей проблемой и сжатыми данными:
Дополнительные сведения о кодировке 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 считаются устаревшей причиной производительности и масштабируемости. Кроме того, вы не хотите привязывать свой проект к определенному типу базы данных.
Ответ 3
Если вы используете PDO, не забудьте инициировать его с помощью UTF8:
$con = new PDO('mysql:host=' . $server . ';dbname=' . $db . ';charset=UTF8', $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
(просто потратил 5 часов, чтобы понять это, надеюсь, что это спасет кого-то драгоценное время...)
Ответ 4
У меня была та же проблема,
Задайте все сопоставления text/varchar в phpMyAdmin в utf-8 и в файлах php добавьте это:
mysql_set_charset ( "utf8", $your_connection_name);
Это разрешило это для меня.
Ответ 5
решение для этого может быть таким же простым, как:
- найти функцию/метод подключения phpmysqladmin
- добавить это после того, как база данных подключена
$db_conect->set_charset('utf8');
Ответ 6
Вот мой способ, как восстановить данные без рывков от 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
}
Ответ 7
Во-первых, от клиента
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]
в CREATE TABLE foo ADD COLUMN foo CHAR ...
)
Я считаю, что я перечислил соответствующие все параметры на стороне mysql.
Если вы все еще теряетесь, прочитайте отлично docs и, возможно, это question, которое может быть потеряно некоторый свет (особенно, как я, хотя я понял это, глядя только на клиента mysql в первый раз).
Ответ 8
phpmyadmin не следует за соединением MySQL, потому что он определяет его правильную сортировку в файле конфигурации phpmyadmin.
Итак, если мы не хотим или не можем получить доступ к параметрам сервера, мы должны просто заставить его отправлять результаты в другом формате (кодировании), совместимом с клиентом, то есть phpmyadmin
например, если и сопоставление соединений MySQL, и charset MySQL являются utf8, но phpmyadmin - это ISO, мы должны просто добавить это до любого запроса select, отправленного на MYSQL через phpmyadmin:
SET SESSION CHARACTER_SET_RESULTS =latin1;
Ответ 9
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!
Ответ 10
У меня была точно такая же проблема. Шифрование базы данных - utf-8, а сортировка - utf8_unicode_ci. Я смог увидеть текст Unicode в моем webapp, но результаты phpMyAdmin и sqldump были искажены.
Оказалось, что проблема заключалась в том, что веб-приложение my подключалось к MySQL. Мне не хватало флаг кодирования.
После того, как я исправил его, я смог правильно видеть греческие символы как в phpMyAdmin, так и в sqldump, но потерял все мои предыдущие записи.
Ответ 11
просто раскомментируйте эти строки в библиотеках /database _interface.lib.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 для повторного преобразования соединения. Это будет работать.
Ответ 12
Имена функций и файлов не соответствуют именам новых версий 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;");
}
Что это. Работает как шарм.
Ответ 13
Более легкое решение для wamp: перейдите на phpMyAdmin, щелкните localhost, выберите latin1_bin для сопоставления соединений с сервером, затем начните создавать базу данных и таблицу
Ответ 14
Его очень просто добавить многоязычность в myphpadmin, если у вас есть garbdata, отображаемый в myphpadmin, просто перейдите на myphpadmin, нажмите на свою базу данных, перейдите на вкладку операций на вкладке "Операция", см. раздел сортировки, установите его в utf8_general_ci, после чего все ваши garbdata будут отображаться правильно, простой и легкий трюк
Ответ 15
Добавить:
mysql_query("SET NAMES UTF8");
ниже:
mysql_select_db(/*your_database_name*/);
Ответ 16
Это работает для меня,
mysqli_query($con, "SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");