Как отобразить символы UTF-8 в phpMyAdmin?
У меня правильно установлена база данных UTF-8, и я работаю с базой данных, содержащей японские символы. Если я делаю SELECT *... из командной строки mysql, я правильно вижу японские символы. При извлечении данных из базы данных и отображении их на веб-странице я вижу их правильно.
Однако при просмотре данных таблицы в phpMyAdmin я просто вижу текст мусора. то есть.
ç§ã¯æ- ¥æœ¬æ- ™ç†ãŒå¥½ãã§ã™ã€, AE- ¥æœ¬æ- ™ ç † ã,...
Как я могу заставить phpMyAdmin отображать символы на японском?
Кодировка символов на странице HTML установлена в UTF-8.
Редактировать:
Я попытался экспортировать свою базу данных и открыл файл.sql в geany. Символы по-прежнему искажены, хотя кодировка установлена в UTF-8. (Однако, выполнение mysqldump базы данных также показывает искаженные символы).
Набор символов установлен правильно для базы данных и всех таблиц ("латиница" не найдена нигде в файле)
CREATE DATABASE `japanese` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Я добавил строки в my.cnf и перезапустил mysql, но изменений нет. Я использую Zend Framework для вставки данных в базу данных.
Я собираюсь открыть награду за этот вопрос, поскольку я действительно хочу выяснить это.
18 ответов
Я немного погуглил и наткнулся на эту страницу
Команда, кажется, не имеет смысла, но я все равно попробовал:
В файле /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? Почему это работает?
К сожалению, phpMyAdmin является одним из первых php-приложений, которые правильно говорят с MySQL о charset. Ваша проблема, скорее всего, связана с тем, что база данных не хранит правильные строки UTF-8.
Чтобы правильно отображать символы в phpMyAdmin, данные должны быть правильно сохранены в базе данных. Однако преобразование базы данных в правильную кодировку часто нарушает работу веб-приложений, которые не поддерживают функцию, связанную с кодировкой, предоставляемую MySQL.
Могу я спросить: MySQL > версии 4.1? Для какого веб-приложения используется база данных? PHPBB? Была ли база данных перенесена из более старой версии веб-приложения или из более старой версии MySQL?
Я не советую братьям, если используемое вами веб-приложение слишком старое и не поддерживается. Конвертируйте базу данных в реальный UTF-8, только если вы уверены, что веб-приложение может правильно их прочитать.
Редактировать:
Ваш MySQL > 4.1, это означает, что он поддерживает кодировку. Каковы параметры сортировки charset для вашей базы данных? Я уверен, что вы используете 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
вutf8
, - Сохранить как новый файл 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
Для получения дополнительной информации о charset на 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 часов, чтобы понять это, надеюсь, это сэкономит кому-то драгоценное время...)
У меня такая же проблема,
Установите для всех сопоставлений текста /varchar в phpMyAdmin значение utf-8, а в файлах php добавьте следующее:
mysql_set_charset ("utf8", $ your_connection_name);
Это решило это для меня.
Решение для этого может быть так же просто, как:
- найти функцию / метод подключения phpmysqladmin
- добавить это после подключения базы данных
$db_conect->set_charset('utf8');
+ Изменить latin1_swedish_ci
в utf8_general_ci
в phpmyadmin->table_name->field_name
Вот где вы найдете его на экране:
Вот мой способ, как мне восстановить данные без ослабления от 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
}
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!
Имена функций и файлов не совпадают с именами в более новых версиях 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;"); }
Вот и все. Работает как шарм.
Сначала от клиента делаем
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. Если вы все еще заблудились, прочитайте прекрасные документы и, возможно, этот вопрос, который может пролить некоторый свет (особенно на то, как я понял, что правильно понял, только с первого взгляда на клиент MySQL).
Очень просто добавить многоязыковой язык в myphpadmin, если вы получили garbdata, отображаемый в myphpadmin, просто перейдите на myphpadmin, щелкните вашу базу данных, перейдите на вкладку операций на странице вкладок операций, смотрите раздел сравнения, установите его в utf8_general_ci, после чего все ваши garbdata будут отображаться правильно. простой и легкий трюк
У меня была точно такая же проблема. Кодировка базы данных - это utf-8, а сопоставление - utf8_unicode_ci. Мне удалось увидеть текст Unicode в моем веб-приложении, но результаты phpMyAdmin и sqldump были искажены.
Оказалось, что проблема была в том, как мое веб-приложение подключалось к MySQL. Мне не хватало флага кодирования.
После того, как я это исправил, я смог правильно видеть греческие символы как в phpMyAdmin, так и в sqldump, но потерял все свои предыдущие записи.
Просто раскомментируйте эти строки в библиотеки /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 без сохранения charset, вам не нужен phpmyadmin для повторного преобразования соединения. Это будет работать
Более простое решение для wamp: зайдите в phpMyAdmin, нажмите localhost, выберите latin1_bin для сопоставления соединений с сервером, затем начните создавать базу данных и таблицу.
ALTER TABLE table_name
ПРЕОБРАЗОВАТЬ НА ХАРАКТЕР НАБОРА utf8;
* ВАЖНО: сначала выполните резервное копирование, затем выполните
Добавлять:
mysql_query("SET NAMES UTF8");
ниже:
mysql_select_db(/*your_database_name*/);
Меня устраивает,
mysqli_query($con, "SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");