* ВАЖНО: сначала выполните резервное копирование, затем выполните

я правильно установлена ​​база данных 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 для вставки данных в базу данных.

Я собираюсь открыть награду за этот вопрос, поскольку я действительно хочу выяснить это.

 Matt McCormick24 янв. 2011 г., 16:37
phpMyAdmin версия 3.3.2deb1 - кодировка MySQL: Unicode UTF-8 (utf8) - параметры сортировки соединений MySQL по умолчанию - utf8_general_ci
 nikhil50024 янв. 2011 г., 13:03
Какую версию phpMyAdmin вы используете? Целевая страница phpMyAdmin отображает параметры сортировки соединений MySQL, а также кодировку MySQL - оба они UTF-8?
 Pekka 웃24 янв. 2011 г., 03:09
Это, вероятно, проблема в настройках соединения PhpMYAdmin. Он также должен быть явно установлен на UTF-8. У меня нет под рукой копии, но обычно она находится где-то рядом с первой страницей
 Matt McCormick24 янв. 2011 г., 04:19
Я нигде не вижу настроек в phpMyAdmin, и поиски в Google до сих пор встречаются с пустыми руками.
 Star Light13 нояб. 2017 г., 18:25
Я надеюсь, что эта статья поможет вам:toptal.com/php/a-utf-8-primer-for-php-and-mysql

Ответы на вопрос(18)

pMyAdmin. Вот как это исправить в новой версии 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;");
}

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

Решение Вопроса

это страница

Команда, кажется, не имеет смысла, но я все равно попробовал:

В файле /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? Почему это работает?

 Paul Norman03 мар. 2011 г., 19:01
Это сработало и для меня. Вы узнали почему? Я проверил и дважды проверил все возможные вещи (все PHP / mb_string, MySQL соединения / Apache / html заголовки / мета-типы) правильно установлен в UTF-8 и данные хранятся правильно
 joao2fast4u29 авг. 2017 г., 19:11
Ссылка мертва
 Matt McCormick04 мар. 2011 г., 05:59
Нет, я все еще не уверен. Я предполагаю, что есть ошибка где-то еще в phpMyAdmin.
 Paul Norman07 мар. 2011 г., 11:21
В моем случае PMA был прав, и ошибка из-за того, что я не установил соединение с базой данных явно из PHP. В моих сценариях мне нужно было явное выражение $ mysqli-> set_charset ('utf8'); Я в основном сохранял все свои данные в каком-то нечетном латиноамериканском / utf-8 месиве, так что, если он извлекается моей оболочкой sites / latin1 (с использованием latin1), он возвращает данные utf-8, но если они извлекаются из phpMyAdmin (соединение utf-8) дает мне этих забавных маленьких персонажей. Мое исправление состояло в том, чтобы извлечь данные, используя соединение db latin1, и обновить их, используя utf-8 из PHP. Небрежно, но функционально!

потому что он определяет правильное сопоставление в файле конфигурации phpmyadmin.

Поэтому, если мы не хотим или не можем получить доступ к параметрам сервера, мы просто должны заставить его отправлять результаты в другом формате (кодировке), совместимом с клиентом, т.е. phpmyadmin.

например, если параметры сортировки соединения MySQL и кодировки MySQL - utf8, но phpmyadmin - это ISO, мы должны просто добавить этот, прежде чем любой запрос select будет отправлен в MYSQL через phpmyadmin:

SET SESSION CHARACTER_SET_RESULTS =latin1;

а сопоставление - utf8_unicode_ci. Мне удалось увидеть текст Unicode в моем веб-приложении, но результаты phpMyAdmin и sqldump были искажены.

Оказалось, что проблема была в путимой веб-приложение подключалось к MySQL. Мне не хватало флага кодирования.

После того, как я это исправил, я смог правильно видеть греческие символы как в phpMyAdmin, так и в sqldump, нопотерял все мои предыдущие записи.

как мне восстановить данные без ослабления от 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
    }

Сначала от клиента делаем

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 с первого взгляда).

если у вас есть garbdata, отображаемый в myphpadmin, просто перейдите на myphpadmin, щелкните вашу базу данных, перейдите на вкладку операций на странице вкладок операций, смотрите раздел сравнения, установите его в utf8_general_ci, после чего все ваши garbdata будут отображаться правильно. простой и легкий трюк

Меня устраивает,

mysqli_query($con, "SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

phpMyAdmin является одним из первых php-приложений, которые правильно говорят с MySQL о charset. Ваша проблема, скорее всего, связана с тем, что база данных не хранит правильные строки UTF-8.

Чтобы правильно отображать символы в phpMyAdmin, данные должны быть правильно сохранены в базе данных. Однако преобразование базы данных в правильную кодировку часто нарушает работу веб-приложений, которые не поддерживают функцию, связанную с кодировкой, предоставляемую MySQL.

Могу я спросить: MySQL> версии 4.1? Для какого веб-приложения используется база данных? PHPBB? Была ли база данных перенесена из более старой версии веб-приложения или из более старой версии MySQL?

Я не советую брату, если используемое вами веб-приложение слишком старое и не поддерживается. Преобразуйте базу данных в реальный UTF-8, только если вы уверены, что веб-приложение может правильно их прочитать.

Редактировать:

Ваш MySQL> 4.1, это означает, что он поддерживает кодировку. Каковы параметры сортировки charset для вашей базы данных? Я уверен, что вы используетеlatin1, которое является именем MySQL для ASCII, для хранения текста UTF-8 в байтах, в базу данных.

Для нечувствительных к charset клиентов (то есть 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 считаются устаревшими из-за проблем производительности и масштабируемости. Кроме того, вы не хотите связывать свой проект с конкретным типом базы данных.
 Matt McCormick24 янв. 2011 г., 16:42
MySQL версия 5.1.41. Как я уже писал, если я запускаю инструкцию SELECT из командной строки mysql, я правильно вижу японские символы и вижу их на веб-странице, так что это специфическая проблема phpMyAdmin. База данных предназначена для моего собственного веб-приложения, которое я разрабатываю. Это не phpBB, и он не был перенесен из чего-либо. Я не говорю о переходе на UTF-8. Все текстовые поля были установлены в UTF-8 с самого начала.
 bobince25 янв. 2011 г., 23:38
+1 Командная строка, особенно в Windows, вовсе не является надежным индикатором кодировки; phpMyAdmin обычно прав.
 timdream26 янв. 2011 г., 17:33
Новый ответ для вас. Вероятно, есть тонны статей, посвященных одной и той же вещи, если вы не согласитесь с моим, Google для "SET NAMES UTF8".
 shamittomar27 янв. 2011 г., 06:24
пожалуйста, не говорик несчастью, Очень повезло, что PHPMyAdmin делает это :) +1
 Matt McCormick27 янв. 2011 г., 06:05
Спасибо за ваше редактирование Тим. Я отредактировал свой вопрос, чтобы предоставить больше деталей. @bobince - я использую Ubuntu.

Добавлять:

mysql_query("SET NAMES UTF8");

ниже:

mysql_select_db(/*your_database_name*/);

Установите все сопоставления текста / varchar в phpMyAdmin в utf-8 и в файлах php добавьте это:

mysql_set_charset ("utf8", $ your_connection_name);

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

 Dennis9828 июн. 2015 г., 20:56
...соответственно$mysqli->set_charset("utf8"); для MySQLi. ;)

зайдите в phpMyAdmin, нажмите localhost, выберите latin1_bin для сопоставления соединений с сервером, затем начните создавать базу данных и таблицу.

1- Открыть файл:

C:\wamp\bin\mysql\mysql..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!

 $con = new PDO('mysql:host=' . $server . ';dbname=' . $db . ';charset=UTF8', $user, $pass,  array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

(просто потратил 5 часов, чтобы понять это, надеюсь, это сэкономит кому-то драгоценное время ...)

 yello16 дек. 2017 г., 15:32
Я тоже работал, используя PDO, таблица MySQL установлена ​​в utf8_bin, китайские иероглифы, используя XAMPP в Windows 10, к счастью, нашел ее в течение 5 часов.

table_name ПРЕОБРАЗОВАТЬ В ХАРАКТЕР

* ВАЖНО: сначала выполните резервное копирование, затем выполните

найти функцию / метод подключения phpmysqladminдобавить это после подключения базы данных$db_conect->set_charset('utf8');

ib.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 для повторного преобразования соединения. Это будет работать

latin1_swedish_ci вutf8_general_ci в phpmyadmin-> table_name-> field_name

Вот где вы найдете его на экране:

Ваш ответ на вопрос