MySQL在UTF-8PHP文件中输出西方编码

MySQL在UTF-8PHP文件中输出西方编码,php,mysql,nginx,phpmyadmin,mysqli,Php,Mysql,Nginx,Phpmyadmin,Mysqli,我有以下问题:在一个非常简单的php mysqli查询上: if ( $result = $mysqli->query( $sqlquery ) ) { $res = $result->fetch_all(); $result->close(); } 虽然数据库、表和列都在utf8\u general\u cicollation中,但我将字符串错误地编码为西方编码字符串。php脚本本身是utf-8编码的,mysql-less部分得到了正确的编码。因此,假设ec

我有以下问题:在一个非常简单的php mysqli查询上:

if ( $result = $mysqli->query( $sqlquery ) )
{
    $res = $result->fetch_all();
    $result->close();
}
虽然数据库、表和列都在
utf8\u general\u ci
collation中,但我将字符串错误地编码为西方编码字符串。php脚本本身是utf-8编码的,mysql-less部分得到了正确的编码。因此,假设
echo“ő”
工作正常,但是前面示例中的
echo$res[0]
在以正确的UTF-8编码查看文件时输出
EF BF BD
字符。如果我手动将浏览器的编码切换到西方,mysqli来源的字符串将得到良好的解码,除了非西方字符被替换为“?”之外

更奇怪的是,在我的开发环境中,这种情况并没有发生,而在我的Web服务器上却发生了。开发人员环境是一个LAMP堆栈(统一服务器),而Web服务器使用nginx

在本例中,我使用phpMyAdmin在数据库中输入数据,在phpMyAdmin内部它显示得非常完美。phpMyAdmin的排序规则也是utf-8。我相信问题一定在这里附近的某个地方,就像在同一个Web服务器上一样,对于我通过php输入数据的其他站点(使用POST)同样的问题不会发生。在这种情况下,数据在输入和查看时都正确可见(我的意思是在php生成的网页中),但在phpMyAdmin中特殊字符不正确


你能帮我从哪里开始调试吗?它是否连接到phpmysqlnginxphpMyAdmin

使用mysqli::set\u charset函数

$mysqli->set_charset('utf8'); //returns false if the encoding was not valid... won't happen

我已经有一段时间没有使用mysqli了,但如果情况相同,连接默认使用拉丁-瑞典语编码(iso8859-1)

<>我会考虑你的页面已经使用了UTF8编码:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
iconv
做了一些非常相似的事情:说实话,我不知道有什么不同,但这里是函数引用的链接:

我刚刚意识到你可能有一些utf8格式的字符串,还有一些是拉丁瑞典语。你可以使用mb_detect_编码:

如果安装了iconv(命令行),还可以转储数据库并使用iconv:

iconv -f latain -t utf-8 < currentdb.sql > fixeddb.sql
iconv-f latain-t utf-8fixeddb.sql
用于在连接后将客户端编码更改为UTF-8:

$mysqli->set_charset("utf8");
客户机编码是MySql希望您输入的内容(例如,在搜索查询中插入用户提供的文本时)和它给您结果的内容(因此它必须匹配您的输出编码,以便
echo
正确显示内容)

您需要让它与web页面的编码匹配,以说明上述两种情况和PHP源文件的编码(以便正确解释查询的硬编码部分)

更新:如何将使用拉丁语-1插入的数据转换为utf-8

对于已使用错误连接编码插入的数据,有一个方便的解决方案可以解决此问题。对于包含此类数据的每列,您需要执行以下操作:

ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
每次都应使用数据库中的正确值替换占位符
表名
列名
现有列类型

它的作用是

  • 告诉MySql它需要在该列中以拉丁文1存储数据。此字符集仅包含utf8的一小部分,因此通常此转换涉及数据丢失,但在这种特定情况下,数据在输入时已被解释为拉丁文1,因此不会有副作用。然而,MySql将在内部转换字节表示对数据进行修改,以匹配最初从PHP发送的内容
  • 将列转换为没有相关编码信息的二进制类型(
    BLOB
    )。此时,该列将包含正确的utf8字符串的原始字节
  • 将列转换为以前的字符类型,告诉MySql原始字节应被视为utf8编码
  • 警告:只有当相关列只包含错误插入的数据时,才能使用这种不加选择的方法。任何正确插入的数据都将在第一次出现任何非ASCII字符时被截断!


    因此,在PHP端修复程序生效之前,立即执行此操作是一个好主意。

    尽管不熟悉mysqli:PHP头是否告诉浏览器正确的编码?谢谢,它可以工作!您能给出任何指针,说明如何在仍然使用原始编码的情况下转换从PHP填充的数据库内容吗?谢谢非常,非常高兴看到不使用PHP就可以进行转换!感谢它的工作!您能给出任何指针如何在仍然使用原始编码的情况下转换从PHP填充的数据库内容吗?
    ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
    ALTER TABLE table_name MODIFY column_name BLOB;
    ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;