如何在phpMyAdmin中显示UTF-8字符?

时间:2011-01-24 01:50:47

标签: mysql unicode utf-8 phpmyadmin

我将我的数据库正确设置为UTF-8并处理包含日文字符的数据库。如果我从mysql命令行执行SELECT * ...,我会正确地看到日文字符。从数据库中提取数据并将其显示在网页上时,我看得恰到好处。

但是,在phpMyAdmin中查看表数据时,我只看到垃圾文本。即

ç§ã¯æ-¥æœ¬æ-™C†ãŒå¥½ãã§ã™ã€,æ-¥æœ¬æ-™C†A,...

如何让phpMyAdmin以日语显示字符?

HTML页面上的字符编码设置为UTF-8。

编辑:

我尝试导出数据库并在geany中打开.sql文件。即使编码设置为UTF-8,字符仍然是乱码。 (但是,执行数据库的mysqldump也会显示乱码)。

为数据库和所有表格设置了正确的字符集(在文件中的任何位置都找不到“latin”)

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

我已将这些行添加到my.cnf并重新启动了mysql,但没有任何变化。我正在使用Zend Framework将数据插入数据库。

我打算为这个问题开一个赏金,因为我真的很想弄明白。

17 个答案:

答案 0 :(得分:35)

不幸的是,phpMyAdmin是第一个正确地与MySQL谈论关于charset的php应用程序之一。您的问题很可能是因为数据库首先没有存储正确的UTF-8字符串。

为了在phpMyAdmin中正确显示字符,数据必须正确存储在数据库中。但是,将数据库转换为正确的字符集通常会破坏不了解MySQL提供的字符集相关功能的Web应用程序。

请问:是MySQL>版本4.1?该数据库适用于哪种Web应用程序?亚历克?数据库是从旧版本的Web应用程序迁移还是从旧版本的MySQL迁移?

如果您使用的网络应用程序太旧且不受支持,我的建议不是兄弟。如果您确定Web应用程序可以正确读取它们,则只将数据库转换为真正的UTF-8。


修改:

你的MySQL是> 4.1,这意味着它是charset-aware。您的数据库的字符集整理设置是什么?我很确定您使用latin1(ASCII的MySQL名称)将UTF-8文本以'字节'存储到数据库中。

对于不受charset不敏感的客户端(即mysql-cli和php-mod-mysql),字符会正确显示,因为它们作为字节传输到数据库或从数据库传输。在phpMyAdmin中,字节被读取并显示为ASCII字符,这就是你看起来的垃圾文本。

在亚洲许多地区,MySQL 4.0已经过时,多年前(2005年?)花了不少时间。有一种标准的方法来处理你的问题和吞噬数据:

  1. .sql
  2. 备份数据库
  3. 在支持UTF-8的文本编辑器中打开它,确保它们看起来正确。
  4. 查找charset collation latin1_general_ci,将latin1替换为utf8
  5. 另存为新的sql文件,请勿覆盖备份
  6. 导入新文件,现在它们将在phpMyAdmin中正确显示,并且您网络应用中的日语将成为问号。这很正常。
  7. 对于依赖php-mod-mysql的php web应用程序,在mysql_query("SET NAMES UTF8");之后插入mysql_connect(),现在问号就会消失。
  8. 为mysql-cli添加以下配置my.ini

    # CLIENT SECTION
    [mysql]
    default-character-set=utf8
    # SERVER SECTION
    [mysqld]
    default-character-set=utf8
    
  9. 有关MySQL charset的更多信息,请参阅手册: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html

    请注意,我假设您的Web应用程序使用php-mod-mysql连接到数据库(因此mysql_connect()函数),因为php-mod-mysql是我能想到的唯一仍然触发的扩展这个问题到了这一天。

    phpMyAdmin使用php-mod-mysqli连接MySQL。我从来没有学过如何使用它因为切换到框架*来开发我的php项目。我强烈建议你也这样做。

    • 许多框架,例如CodeIgniter,Zend,使用mysqli或pdo连接数据库。 mod-mysql函数被认为是过时的导致性能和可伸缩性问题。此外,您不希望将项目绑定到特定类型的数据库。

答案 1 :(得分:29)

如果您正在使用PDO,请不要忘记使用UTF8启动它:

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

(只花了5个小时来解决这个问题,希望能节省宝贵的时间......)

答案 2 :(得分:14)

我做了一些谷歌搜索并遇到了this页面

该命令似乎没有意义,但无论如何我都试过了:

在我添加的PMA_DBI_connect()语句之前的函数return末尾的/usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.php文件中:

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

它有效!我现在在phpMyAdmin中看到日文字符。 WTF?为什么这样做?

答案 3 :(得分:7)

我遇到了同样的问题,

将phpMyAdmin中的所有text / varchar排序设置为utf-8,并在php文件中添加:

mysql_set_charset(“utf8”,$ your_connection_name);

这解决了我。

答案 4 :(得分:5)

解决方案可以像以下一样简单:

  1. 找到phpmysqladmin连接功能/方法
  2. 在数据库连接$db_conect->set_charset('utf8');
  3. 之后添加此项

答案 5 :(得分:3)

phpmyadmin不遵循MySQL连接,因为它在phpmyadmin配置文件中定义了正确的排序规则。

因此,如果我们不想要或者如果我们无法访问服务器参数,我们应该强制它以与客户端兼容的不同格式(编码)发送结果,即phpmyadmin

例如,如果MySQL连接排序规则和MySQL字符集都是utf8但phpmyadmin是ISO,我们应该在通过phpmyadmin发送到MYSQL的任何选择查询之前添加这个:

SET SESSION CHARACTER_SET_RESULTS =latin1;

答案 6 :(得分:3)

以下是我如何在没有松散的情况下从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 :(得分:3)

在phpmyadmin-> table_name-> field_name

中将latin1_swedish_ci更改为utf8_general_ci

您可以在屏幕上找到它:

答案 8 :(得分:2)

首先,从客户端做

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客户端时我是如何做到的)。

答案 9 :(得分:2)

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 :(得分:2)

函数和文件名与较新版本的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;");
    }
    
  4. 就是这样。像魅力一样。

答案 11 :(得分:1)

我有完全相同的问题。数据库字符集是utf-8,排序规则是utf8_unicode_ci。我能够在我的webapp中看到Unicode文本,但phpMyAdmin和sqldump结果是乱码。

事实证明问题出在我的 Web应用程序连接到MySQL的方式上。我错过了编码标志。

在我修复它之后,我能够在phpMyAdmin和sqldump中正确地看到希腊字符,但是丢失了我之前的所有条目

答案 12 :(得分:1)

如果你在myphpadmin中显示了garbdata,那么在myphpadmin中添加多语言非常简单,只需转到myphpadmin点击你的数据库转到操作标签页的操作选项卡,请参阅collat​​ion部分将其设置为utf8_general_ci,之后你的所有garbdata都会正确显示。一个简单易行的技巧

答案 13 :(得分:0)

ALTER TABLE table_name转换为CHARACTER SET utf8;

*重要提示:请先备份,然后再执行

答案 14 :(得分:0)

它对我有用,

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

答案 15 :(得分:0)

添加:

mysql_query("SET NAMES UTF8");

下面:

mysql_select_db(/*your_database_name*/);

答案 16 :(得分:0)

更简单的解决方案是:     去phpMyAdmin,     单击localhost,     选择latin1_bin进行服务器连接整理,     然后开始创建数据库和表