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

  1. Сделайте резервную копию вашей базы данных как .sql
  2. Откройте его в текстовом редакторе с поддержкой UTF-8, убедитесь, что он выглядит правильно.
  3. Ищу charset collation latin1_general_ciзаменить latin1 в utf8,
  4. Сохранить как новый файл sql, не перезаписывать резервную копию
  5. Импортируйте новый файл, теперь он будет корректно выглядеть в phpMyAdmin, а японский язык в вашем веб-приложении станет вопросительным знаком. Это нормально.
  6. Для вашего php веб-приложения, которое использует php-mod-mysql, вставьте mysql_query("SET NAMES UTF8"); после mysql_connect()Теперь вопросительные знаки исчезнут.
  7. Добавьте следующую конфигурацию 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);

Это решило это для меня.

Решение для этого может быть так же просто, как:

  1. найти функцию / метод подключения phpmysqladmin
  2. добавить это после подключения базы данных $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:

  1. Найти файл: phpmyadmin/libraries/DatabaseInterface.php

  2. В функции: public function query

  3. Сразу после открытия { Добавь это:

    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'");
Другие вопросы по тегам