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

Posted

技术标签:

【中文标题】如何在 phpMyAdmin 中显示 UTF-8 字符?【英文标题】:How to display UTF-8 characters in phpMyAdmin? 【发布时间】: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 【参考方案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 在亚洲许多地区过时时,已经花费了无数小时。有一种标准方法可以处理您的问题和吞噬数据:

    将数据库备份为.sql 在支持 UTF-8 的文本编辑器中打开它,确保它们看起来正确。 查找charset collation latin1_general_ci,将latin1 替换为utf8另存为新的 sql 文件,不要覆盖备份 导入新文件,它们现在将在 phpMyAdmin 中正确显示,并且您的 Web 应用程序上的日语将变成问号。这很正常。 对于依赖 php-mod-mysql 的 php web 应用,在 mysql_connect() 之后插入 mysql_query("SET NAMES UTF8");,现在问号将消失。

    为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】:

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

    找到phpmysqladmin连接函数/方法 在数据库连接后添加这个$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这边列出了所有相关设置。 如果仍然迷路,请阅读 docs 和 question,这可能会有所启发(尤其是我第一次只查看 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 中修复:

    查找文件: 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;");
    
    

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

【讨论】:

【参考方案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;

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

【讨论】:

以上是关于如何在 phpMyAdmin 中显示 UTF-8 字符?的主要内容,如果未能解决你的问题,请参考以下文章

更改默认字符集

如何在 phpmyadmin 中显示编辑、复制、删除?

如何在 phpMyAdmin 中调用和显示数据库

如何在 phpmyadmin 中显示外键的内容

如何在 phpmyadmin 中将“关系显示列”设置为默认值

如何在 MAMP 中使用 phpMyAdmin 在 MySQL 中显示关系视图