【问题标题】:How to display UTF-8 characters in phpMyAdmin?如何在 phpMyAdmin 中显示 UTF-8 字符?
【发布时间】:2011-06-14 06:08:18
【问题描述】:

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

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

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

如何让 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 将数据插入数据库。

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

【问题讨论】:

  • 这可能是 PhpMYAdmin 的连接设置有问题。它也必须显式设置为 UTF-8。我手边没有副本,但它通常在首页附近的某个地方
  • 我在 phpMyAdmin 中的任何地方都看不到设置,到目前为止,Google 搜索对这些设置空手而归。
  • 您使用的是什么版本的 phpMyAdmin? phpMyAdmin 的登录页面显示 MySQL 连接排序规则以及 MySQL 字符集 - 它们都是 UTF-8 吗?
  • phpMyAdmin 版本 3.3.2deb1 - MySQL 字符集:UTF-8 Unicode (utf8) - MySQL 连接排序规则默认为 utf8_general_ci
  • 希望这篇文章能给你带来很好的帮助:toptal.com/php/a-utf-8-primer-for-php-and-mysql

标签: mysql unicode utf-8 phpmyadmin


【解决方案1】:

不幸的是,phpMyAdmin 是第一个与 MySQL 正确讨论字符集的 php 应用程序之一。您的问题很可能是因为数据库一开始没有存储正确的 UTF-8 字符串。

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

请问:MySQL > 4.1 版吗?数据库用于什么 Web 应用程序? phpBB?数据库是从旧版本的 Web 应用程序还是旧版本的 MySQL 迁移而来的?

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


编辑:

您的 MySQL > 4.1,这意味着它可以识别字符集。您的数据库的字符集排序规则设置是什么?我很确定您正在使用latin1(这是 ASCII 的 MySQL 名称)将 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 中正确显示,并且您的 Web 应用程序上的日语将变成问号。这很正常。
  6. 对于依赖 php-mod-mysql 的 php web 应用,在 mysql_connect() 之后插入 mysql_query("SET NAMES UTF8");,现在问号将消失。
  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

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

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

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

【讨论】:

  • MySQL 版本 5.1.41。正如我所写,如果我从 mysql 命令行运行 SELECT 语句,我会正确地看到日文字符并在网页上正确地看到它们,所以这是一个 phpMyAdmin 特定的问题。该数据库用于我自己正在开发的 Web 应用程序。它不是 phpBB,也没有从任何东西迁移。我不是在谈论转换为 UTF-8。所有文本字段从一开始就设置为 UTF-8。
  • +1 命令行,尤其是在 Windows 上,根本不是编码的可靠指标; phpMyAdmin 实际上通常是正确的。
  • 给你的新答案。如果你不同意我的谷歌“SET NAMES UTF8”,可能有很多文章处理同样的事情。
  • 感谢您的编辑蒂姆。我已经编辑了我的问题以提供更多详细信息。 @bobince - 我正在使用 Ubuntu。
  • 请不要说不幸。很幸运 PHPMyAdmin 做到了 :) +1
【解决方案2】:

我做了更多的谷歌搜索,发现了this页面

该命令似乎没有意义,但我还是尝试了:

在文件 /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 中看到日文字符。怎么回事?为什么会这样?

【讨论】:

  • 这对我也有用。你找出原因了吗?我已经检查并仔细检查了所有可能的东西(所有 PHP / mb_string、MySQL 连接 / Apache / html 标头 / 元类型)是否正确设置为 UTF-8 并且数据存储正确
  • 不,我仍然不确定。我假设 phpMyAdmin 的其他地方存在错误。
  • 在我的情况下,PMA 是正确的,错误是由于我没有明确地从 PHP 设置我的数据库连接。在我的脚本中,我需要一个明确的语句 $mysqli->set_charset('utf8');我基本上一直将所有数据保存在某种奇怪的 latin1 / utf-8 糊状物中,这样如果它被我的站点 / latin1 shell(使用 latin1)拉出,它会返回 utf-8 数据,但如果它是从phpMyAdmin(utf-8 连接)它给了我那些有趣的小字符。我的解决方法是使用 latin1 db 连接提取数据,并使用 PHP 中的 utf-8 更新它。马虎,但实用!
  • 链接失效
【解决方案3】:

解决这个问题的方法很简单:

  1. 找到phpmysqladmin连接函数/方法
  2. 在数据库连接后添加这个$db_conect->set_charset('utf8');

【讨论】:

    【解决方案4】:

    首先,从客户端做

    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这边列出了所有相关设置。 如果仍然迷路,请阅读 docsquestion,这可能会有所启发(尤其是我第一次只查看 mysql 客户端时,我是如何做到的)。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,

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

      mysql_set_charset("utf8", $your_connection_name);

      这为我解决了。

      【讨论】:

      • ...分别为 MySQLi 的 $mysqli->set_charset("utf8");。 ;)
      【解决方案6】:

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

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

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

      SET SESSION CHARACTER_SET_RESULTS =latin1;
      

      【讨论】:

        【解决方案7】:

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

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

        (只花了 5 个小时才弄明白,希望它能节省一些宝贵的时间......)

        【讨论】:

        • 对我也有用,使用PDO,MySQL表设置为utf8_bin,汉字,在Windows 10上使用XAMPP,幸运的是在5小时内找到了这个。
        【解决方案8】:

        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 服务!

        【讨论】:

          【解决方案9】:

          wamp 更简单的解决方案是: 去phpMyAdmin, 点击本地主机, 为服务器连接排序选择 latin1_bin, 然后开始创建数据库和表

          【讨论】:

            【解决方案10】:

            这是我如何将数据从 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
                }
            

            【讨论】:

              【解决方案11】:

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

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

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

              【讨论】:

                【解决方案12】:

                如果您在 myphpadmin 中显示 garbdata,则在 myphpadmin 中添加多语言非常简单,只需转到 myphpadmin 单击您的数据库 转到操作选项卡页面中的操作选项卡查看排序部分将其设置为 utf8_general_ci,之后您的所有 garbdata 将正确显示.一个简单的技巧

                【讨论】:

                  【解决方案13】:

                  添加:

                  mysql_query("SET NAMES UTF8");
                  

                  下面:

                  mysql_select_db(/*your_database_name*/);
                  

                  【讨论】:

                    【解决方案14】:

                    只需在 library/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 重新转换连接。这将起作用。

                    【讨论】:

                      【解决方案15】:

                      函数名和文件名与较新版本的 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;");
                        }
                        

                      就是这样。像魅力一样工作。

                      【讨论】:

                        【解决方案16】:

                        它对我有用,

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

                        【讨论】:

                          【解决方案17】:

                          在 phpmyadmin->table_name->field_name 中将 latin1_swedish_ci 更改为 utf8_general_ci

                          您可以在屏幕上找到它:

                          【讨论】:

                            【解决方案18】:

                            ALTER TABLE table_name CONVERT to CHARACTER SET utf8;

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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2013-04-09
                              • 1970-01-01
                              • 1970-01-01
                              • 2011-06-15
                              • 1970-01-01
                              相关资源
                              最近更新 更多