gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:55:52 25 4
gpt4 key购买 nike

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

if ( $result = $mysqli->query( $sqlquery ) )
{
$res = $result->fetch_all();
$result->close();
}

尽管数据库、表和列在 utf8_general_ci 排序规则中,但我得到的字符串被错误地编码为西方编码字符串。 php 脚本本身是 utf-8 编码的,脚本的无 mysql 部分得到正确的编码。所以说 echo "ő" 工作得很好,但是上一个示例中的 echo $res[0] 在文件时输出 EF BF BD 字符以正确的 UTF-8 编码查看。如果我手动将浏览器的编码切换为西方编码,则 mysqli 来源的字符串会得到很好的解码,除了被替换为“?”的非西方字符。

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

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

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

最佳答案

使用mysqli_set_charset连接后立即将客户端编码更改为 UTF-8:

$mysqli->set_charset("utf8");

客户端编码是 MySql 期望您输入的内容(例如,当您将用户提供的文本插入搜索查询时)以及它为您提供的结果(因此它必须与您的输出编码匹配以便 echo 以正确显示内容)。

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

更新:如何将使用 latin-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;

每次都应将占位符 table_namecolumn_nameexisting_column_type 替换为数据库中的正确值。

这是做什么的

  1. 告诉 MySql 它需要将数据存储在 latin1 的该列中。此字符集仅包含 utf8 的一小部分,因此通常此转换会导致数据丢失,但在这种特定情况下,数据已在输入时被解释为 latin1,因此不会有副作用。但是,MySql 将在内部转换数据的字节表示形式以匹配最初从 PHP 发送的内容。
  2. 将列转换为没有关联编码信息的二进制类型 (BLOB)。此时该列将包含原始字节,它们是正确的 utf8 字符串。
  3. 将列转换为其之前的字符类型,告诉 MySql 应将原始字节视为采用 utf8 编码。

警告:如果相关列包含错误插入的数据,您只能使用这种不分青红皂白的方法。任何已正确插入的数据都将在第一次出现任何非 ASCII 字符时被截断!

因此,最好在 PHP 端修复生效之前立即执行此操作。

关于php - MySQL 在 UTF-8 PHP 文件中输出西方编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12737875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com