Как отобразить символы 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 54

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

  1. резервное копирование базы данных как .sql
  2. откройте его в текстовом редакторе с поддержкой UTF-8, убедитесь, что они выглядят правильно.
  3. искать charset collation latin1_general_ci заменить latin1 to 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
    

для получения дополнительной информации о кодировке на 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);

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

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

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

  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;");
    }
    

вот и все. Работает как шарм.

более легкое решение для wamp: перейти к phpMyAdmin, выберите localhost, выберите latin1_bin для параметров сортировки подключения к серверу, затем начните создавать базу данных и таблицу

добавить:

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'");