Как отображать символы 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 устарел, во многих частях Азии. Существует стандартный способ справиться с вашей проблемой и сжатыми данными:

  • Создайте резервную копию своей базы данных как .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
    

Дополнительные сведения о кодировке 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'");