我将我的数据库正确设置为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将数据插入数据库。
我打算为这个问题开一个赏金,因为我真的很想弄明白。
答案 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年?)花了不少时间。有一种标准的方法来处理你的问题和吞噬数据:
.sql
charset collation latin1_general_ci
,将latin1
替换为utf8
。mysql_query("SET NAMES UTF8");
之后插入mysql_connect()
,现在问号就会消失。为mysql-cli添加以下配置my.ini
:
# CLIENT SECTION
[mysql]
default-character-set=utf8
# SERVER SECTION
[mysqld]
default-character-set=utf8
有关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项目。我强烈建议你也这样做。
答案 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)
解决方案可以像以下一样简单:
$db_conect->set_charset('utf8');
答案 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:
查找文件:
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;");
}
就是这样。像魅力一样。
答案 11 :(得分:1)
我有完全相同的问题。数据库字符集是utf-8,排序规则是utf8_unicode_ci。我能够在我的webapp中看到Unicode文本,但phpMyAdmin和sqldump结果是乱码。
事实证明问题出在我的 Web应用程序连接到MySQL的方式上。我错过了编码标志。
在我修复它之后,我能够在phpMyAdmin和sqldump中正确地看到希腊字符,但是丢失了我之前的所有条目。
答案 12 :(得分:1)
如果你在myphpadmin中显示了garbdata,那么在myphpadmin中添加多语言非常简单,只需转到myphpadmin点击你的数据库转到操作标签页的操作选项卡,请参阅collation部分将其设置为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进行服务器连接整理, 然后开始创建数据库和表