Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL数据似乎没有使用它应该使用的字符编码_Php_Mysql_Utf 8_Character Encoding_Pdo - Fatal编程技术网

Php MySQL数据似乎没有使用它应该使用的字符编码

Php MySQL数据似乎没有使用它应该使用的字符编码,php,mysql,utf-8,character-encoding,pdo,Php,Mysql,Utf 8,Character Encoding,Pdo,首先,感谢所有阅读本文的人。 我在使用PHP的PDO接口的MySQL数据库中遇到了一个非常奇怪的字符编码问题。这些表都是使用UTF8编码的,webapp使用utf-8,但似乎数据库中存储的数据实际上不是utf-8,而是拉丁语-1 在相当长的一段时间内,情况一直很好,但这在导入utf-8编码的数据文件或执行包含特殊字符(如é或ë)的全文搜索时造成了问题 编辑: 一些回复表明这是我的终端的问题。它不是: foreach($dbh->query("SELECT c FROM t") as $ro

首先,感谢所有阅读本文的人。 我在使用PHP的PDO接口的MySQL数据库中遇到了一个非常奇怪的字符编码问题。这些表都是使用UTF8编码的,webapp使用utf-8,但似乎数据库中存储的数据实际上不是utf-8,而是拉丁语-1

在相当长的一段时间内,情况一直很好,但这在导入utf-8编码的数据文件或执行包含特殊字符(如é或ë)的全文搜索时造成了问题

编辑:

一些回复表明这是我的终端的问题。它不是:

foreach($dbh->query("SELECT c FROM t") as $row){
    echo $row['c'] ."\n";
    echo urlencode($row['c'])."\n";
}
$dbh->exec("SET NAMES 'latin1'");
foreach($dbh->query("SELECT c FROM t") as $row){
    echo $row['c'] ."\n";
    echo urlencode($row['c'])."\n";
}
$dbh->exec("SET NAMES 'utf8'");
foreach($dbh->query("SELECT c FROM t") as $row){
    echo $row['c'] ."\n";
    echo urlencode($row['c'])."\n";
}
产出如下:

é
%C3%A9f
é
%C3%A9f
é
%C3%83%C2%A9f
感谢到目前为止的所有人

结束编辑

因此,首先我检查表是否正常工作:

USE information_schema;

mysql> SELECT table_collation FROM tables WHERE table_schema="mydb" and table_name="mytable";
+-----------------+
| table_collation |
+-----------------+
| utf8_general_ci |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT character_set_name,collation_name FROM information_schema.columns WHERE table_schema="mydb" and table_name="t" and column_name="c";
+--------------------+-----------------+
| character_set_name | collation_name  |
+--------------------+-----------------+
| utf8               | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)
但是,数据似乎不是utf-8,而是拉丁语-1:

mysql> use mydb;
Database changed

mysql> SET NAMES 'latin1';
Query OK, 0 rows affected (0.00 sec)

mysql> select c from t;
+---+
| c |
+---+
| é |
+---+
1 row in set (0.00 sec)

mysql> SET NAMES 'utf8';
Query OK, 0 rows affected (0.00 sec)

mysql> select c from t;
+----+
| c  |
+----+
| é |
+----+
1 row in set (0.00 sec)
所以我有两个问题:

1最重要的是,如何处理数据库中已有的数据

2是否有一种方法可以设置DB,使其在连接时实际使用utf-8,还是每次都必须执行set NAME查询

非常感谢您的时间和帮助


Matt

这是您的终端似乎是拉丁语,而不是数据:

有没有办法设置数据库,使其实际使用utf-8

你已经设置好了。 您只需要设置客户端编码,这是通过设置名称“utf8”完成的

事实上,通过使用集合名称,您可以使数据以您设置的任何编码显示。这是集合名称魔法词的唯一用途

如果您有一些本问题未涉及的编码问题

如何处理数据库中已有的数据

不管你想要什么,只要你的数据库返回否?标志。 要恢复数据,必须为表的数据编码集设置名称。这将阻止mysql重新编码数据。因此,您可以获取或转储它,然后使用适当的设置再次加载它

编辑

经过一些考虑,我要说的是,您的数据是utf8格式的,而表编码以某种方式设置为latin1

%C3%A9是字符的完全有效的utf-8表示形式。不知道你从哪里弄来的

而%C3%83%C2%A9是%C3%A9的utf-f编码版本。所以,您的数据库似乎认为您的数据是拉丁文1,并用utf8编码

因此,当您将名称设置为latin1时,不必介意,也不必重新编码

结论:

双重检查表和字段编码。应该是拉丁语

是的,要保存数据,您必须执行以下操作

***上帝啊,我讨厌这个自动格式化的问题,它阻止我在列表项之后发布代码

mysqldump --default_charset=latin1 mydb > mydb.sql
然后检查此转储并将latin1的每个外观更改为utf8。 然后把它装回去


别忘了先备份数据

如果您从HTML页面收到数据并将其保存到数据库中,请不要忘记在HTML的标题部分设置正确的文本编码:

功能描述。从数据库中检索记录,将其转换为所需的编码并写回。

使用

SET character_set_client = "UTF-8";
当你与你的客户联系时。在PHP中,您将通过使用以下函数实现这一点:

set_charset($encoding)
在执行任何实际数据插入/更新之前

连接到您的数据库

将连接设置为UTF-8

设置名称“utf8”

在HTML文件中:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

确保PHPMySQL连接也在UTF-8中。@MarcB:是的,我很确定问题在于此,但我不确定如何修复它。你知道吗?我应该在每个连接上运行$dbh->exec'SET NAMES utf8'吗?当然可以!这就是我要说的。你不是已经有了吗@马特:是的,除非你想在my.ini/my.cnf文件中耍花招,强迫所有连接使用UTF。杜德,你在终端示例中使用的是集合名。你不想说你没有在PDO中使用它吗?谢谢你的帮助。它不是终端,如果我使用$dbh->exec或$dbh->query执行上述命令,应用程序也会发生同样的情况。为了可读性,我使用了终端输出。但是,utf-8编码数据文件的全文搜索和导入都失败。顺便说一句,就webapp而言,字符编码在meta标记和Content-Type头中都设置为utf-8。您必须提供更多信息。你现在的例子对我来说似乎还不错。使用PDO运行相同的测试。使用urlencode对脚本输出进行编码,以确保results@col-弹片:你要的信息已经被添加到原来的帖子里了。嘿,所以这个问题看起来很愚蠢。那么,你是说我应该获取集合名设置为latin1的数据,集合名设置为utf8,然后重新插入它?谢谢你的帮助。但是,在元标记和内容类型头中,字符编码都设置为utf-8。我很肯定这不是问题所在。
set_charset($encoding)
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />