web-dev-qa-db-ja.com

phpMyAdminでUTF-8文字を表示する方法は?

データベースを適切にUTF-8に設定し、日本語の文字を含むデータベースを扱っています。 mysqlコマンドラインからSELECT * ...を実行すると、日本語の文字が正しく表示されます。データベースからデータを引き出してWebページに表示すると、適切に表示されます。

ただし、phpMyAdminでテーブルデータを表示すると、ガベージテキストが表示されます。すなわち。

ç§ã¯æ—¥æœ¬æ–™ç†ãŒå¥½ã㧧ã™ã€、日本料ç†ã...

PhpMyAdminで文字を日本語で表示するにはどうすればよいですか?

HTMLページの文字エンコードはUTF-8に設定されます。

編集:

データベースのエクスポートを試行し、geanyで.sqlファイルを開きました。エンコードがUTF-8に設定されている場合でも、文字は文字化けします。 (ただし、データベースのmysqldumpを実行すると、文字化けが表示されます)。

データベースおよびすべてのテーブルに対して文字セットが正しく設定されています(「ラテン語」はファイル内のどこにも見つかりません)

CREATE DATABASE `japanese` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

My.cnfに行を追加し、mysqlを再起動しましたが、変更はありません。 Zend Frameworkを使用して、データベースにデータを挿入しています。

私は本当にこれを理解したいので、私はこの質問の恩恵を開きます。

57
Matt McCormick

私はもう少しグーグルでやりました this page

コマンドは意味をなさないようですが、とにかく試しました:

ファイルの/usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.phpで、returnステートメントの直前の関数PMA_DBI_connect()の最後に追加しました。

mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;");
mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;");

そしてそれは動作します! phpMyAdminに日本語の文字が表示されるようになりました。 WTF?なぜこれが機能するのですか?

14
Matt McCormick

残念ながら、phpMyAdminは、文字セットについてMySQLと正しく通信する最初のphpアプリケーションの1つです。あなたの問題は、データベースが最初に正しいUTF-8文字列を保存しないという事実が原因である可能性が最も高いです。

PhpMyAdminで文字を正しく表示するには、データをデータベースに正しく保存する必要があります。ただし、データベースを正しい文字セットに変換すると、多くの場合、MySQLが提供する文字セット関連の機能を認識しないWebアプリが破損します。

質問してもいいですか:MySQL>バージョン4.1ですか?データベースの対象となるWebアプリは何ですか? phpBB?データベースは古いバージョンのWebアプリから移行されましたか、それとも古いバージョンのMySQLから移行されましたか?

使用しているWebアプリが古すぎてサポートされていない場合、私の提案は兄弟ではありません。 Webアプリがデータベースを正しく読み取ることができる場合のみ、データベースを実際のUTF-8に変換してください。


編集:

MySQLは4.1以上です。つまり、文字セットを認識します。データベースの文字セット照合設定は何ですか? ASCIIのMySQL名であるlatin1を使用して、UTF-8テキストを「バイト」でデータベースに保存していることは間違いありません。

文字セットに依存しないクライアント(つまり、mysql-cliおよびphp-mod-mysql)の場合、文字はデータベースとの間でバイトとして転送されるため、正しく表示されます。 phpMyAdminでは、バイトが読み取られ、ASCII文字として表示されます。これは、ごみのテキストです。

アジアの多くの地域で、MySQL 4.0が廃止された数年前(2005年?)に無数の時間が費やされていました。問題とデータのゴブリングに対処する標準的な方法があります。

  1. データベースを.sqlとしてバックアップします
  2. UTF-8対応のテキストエディターで開き、正しく表示されることを確認します。
  3. charset collation latin1_general_ciを探し、latin1utf8に置き換えます。
  4. 新しいSQLファイルとして保存し、バックアップを上書きしないでください
  5. 新しいファイルをインポートすると、phpMyAdminで正しく表示され、Webアプリの日本語が疑問符になります。それは正常です。
  6. Php-mod-mysqlに依存するphp Webアプリの場合、mysql_query("SET NAMES UTF8");の後にmysql_connect()を挿入すると、疑問符が消えます。
  7. Mysql-cliの次の構成my.iniを追加します。

    # 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が唯一の問題であると考えられる拡張機能であるため、Webアプリがデータベースに接続するためにphp-mod-mysqlを使用していることを前提としていることに注意してください(したがってmysql_connect()関数)この日。

phpMyAdminはphp-mod-mysqliを使用してMySQLに接続します。 phpプロジェクトを開発するためにフレームワーク*に切り替えるため、その使用方法を学んだことはありません。あなたもそうすることを強くお勧めします。

  • 多くのフレームワーク、例えばCodeIgniter、Zend、mysqliまたはpdoを使用してデータベースに接続します。 mod-mysql関数は廃止されたと見なされ、パフォーマンスとスケーラビリティの問題が発生します。また、プロジェクトを特定のタイプのデータベースに結び付けたくありません。
35
timdream

PDOを使用している場合、UTF8で開始することを忘れないでください。

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

(これを理解するために5時間を費やしただけで、誰かの貴重な時間を節約できることを願っています...)

29
Naama Katiee

同じ問題がありました

PhpMyAdminのすべてのtext/varchar照合をutf-8に設定し、phpファイルでこれを追加します。

mysql_set_charset( "utf8"、$ your_connection_name);

これで解決しました。

7
Dinaga

これに対する解決策は次のように簡単です:

  1. phpmysqladmin接続関数/メソッドを見つける
  2. データベースが接続された後にこれを追加します$db_conect->set_charset('utf8');
5
ajreal

phpmyadminは、適切な照合をphpmyadmin構成ファイルで定義するため、MySQL接続に従いません。

したがって、サーバーパラメータが必要ない場合、またはアクセスできない場合は、クライアントと互換性のある別の形式(エンコード)で結果を送信するように強制する必要があります(phpmyadmin)

たとえば、MySQL接続照合とMySQL文字セットの両方がutf8で、phpmyadminがISOである場合、phpmyadminを介してMYSQLに送信される選択クエリの前にこれを追加する必要があります。

SET SESSION CHARACTER_SET_RESULTS =latin1;
3
mazic roohi

Phpmyadmin-> table_name-> field_nameでlatin1_swedish_ciutf8_general_ciに変更します

これは、画面上で見つける場所です。

3
HaMid Ali

以下は、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
    }
3
pleerock

Myphpadminにgarbdataが表示されている場合、myphpadminに多言語を追加するのは本当に簡単です.myphpadminに移動し、データベースをクリックして操作タブページの操作タブに移動し、照合セクションでutf8_general_ciに設定してくださいシンプルで簡単なトリック

2
user3773240

まず、クライアントから

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フィールドの文字セットと照合を検査します(通常、人々は明示的にそれらを設定しませんが、CREATE TABLE foo ADD COLUMN foo CHAR ...CHAR[(length)] [CHARACTER SET charset_name] [COLLATE collation_name]を与えることは可能です)

Mysqlの側に関連する設定allをリストしたと思います。それでもうまく行かない場合は docs およびおそらく question を読んでください(特に、最初にmysqlクライアントだけを見て正しい結果を得た場合) 。

2
Unreason

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サービスを再起動します!

2
magickey

関数名とファイル名は、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;");
    }
    

それでおしまい。魅力のように機能します。

2
codemonkey

libraries/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は必要ありません。これは動作します。

1
Evan Tedeschi

私はまったく同じ問題を抱えていました。データベースの文字セットはutf-8で、照合はutf8_unicode_ciです。 WebアプリでUnicodeテキストを表示できましたが、phpMyAdminとsqldumpの結果が文字化けしていました。

問題はmy WebアプリケーションがMySQLに接続している方法にあることが判明しました。エンコードフラグがありませんでした。

修正後、phpMyAdminとsqldumpの両方でギリシャ文字を正しく表示できましたが、以前のすべてのエントリが失われました

1
thanassis

ALTER TABLE table_name CONVERT to CHARACTER SET utf8;

*重要:最初にバックアップし、後に実行する

0
Alex M

追加:

mysql_query("SET NAMES UTF8");

未満:

mysql_select_db(/*your_database_name*/);
0
Herlina Astari

わたしにはできる、

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

Wampの簡単な解決策は、phpMyAdminに移動し、localhostをクリックして、サーバー接続の照合にlatin1_binを選択し、データベースとテーブルの作成を開始することです。

0
wma