当前位置: 首页> 最新文章列表> mysqli::set_charset 设置后 SQL 查询乱码?如何确保字符在传输中保持正确

mysqli::set_charset 设置后 SQL 查询乱码?如何确保字符在传输中保持正确

gitbox 2025-09-20
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 前置无关代码示例</span></span><span>
</span><span><span class="hljs-variable">$pre_data</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"cherry"</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$pre_data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>) . </span><span><span class="hljs-string">"<br>"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 文章正文开始</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<h1>mysqli::set_charset 设置后 SQL 查询乱码?如何确保字符在传输中保持正确</h1>"</span></span><span>;

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>在使用 PHP 的 <code>mysqli
"; echo "

这里 utf8mb4 是推荐的字符集,支持完整的 Unicode,包括表情符号。

"
; echo "

3. 常见乱码场景及解决方案

"
; echo "

场景 1:表或字段编码不一致

"
; echo "

即使 set_charset 设置正确,如果数据库表或字段仍是 latin1,中文或特殊字符会被错误解码。

"
; echo "

解决方案:

"
; echo "
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
"
;
echo "

场景 2:页面显示编码不匹配

"
; echo "

如果网页使用 UTF-8 编码,而 MySQL 数据是 utf8mb4,正常情况下不会乱码。但如果网页声明为 ISO-8859-1 或未声明,中文仍会显示异常。

"
; echo "

确保网页头部:

"
; echo "
<meta charset='UTF-8'>
"
;
echo "

场景 3:插入数据前编码不一致

"
; echo "

从表单或接口获取的字符编码必须与 MySQL 连接编码一致,否则在插入时就会产生乱码。

"
; echo "

解决方案:统一编码,例如前端和 PHP 均使用 UTF-8。

"
; echo "

4. 综合最佳实践

"
; echo "
    "; echo "
  1. 数据库和表使用 utf8mb4 字符集。
  2. "
    ; echo "
  3. PHP 与 MySQL 连接后立即调用 mysqli::set_charset('utf8mb4')
  4. "
    ; echo "
  5. 前端网页声明 <meta charset='UTF-8'>,表单提交编码为 UTF-8。
  6. "
    ; echo "
  7. 避免手动使用 utf8_encodeutf8_decode,直接使用原始 UTF-8 数据。
  8. "
    ; echo "
"
; echo "

总结

"
; echo "

字符乱码通常是因为客户端、数据库和显示端编码不一致。使用 mysqli::set_charset 是确保 PHP 与 MySQL 通信正确的关键步骤,但必须结合数据库表和页面编码统一,才能彻底解决乱码问题。

"
; ?> <?php // 尾部无关代码示例 $footer_links = array("Home", "About", "Contact"); foreach ($footer_links as $link) { echo "" . ucfirst($link) . " | "; } ?>