当前位置: 首页> 最新文章列表> 想用 UTF-8?教你如何在 PHP 中正确用 mysqli::set_charset 设置编码

想用 UTF-8?教你如何在 PHP 中正确用 mysqli::set_charset 设置编码

gitbox 2025-09-18

什么是 UTF-8 编码?

UTF-8(Unicode Transformation Format-8)是一种可变长度的字符编码方式,能够表示 Unicode 字符集中的所有字符,并且对英文字符采用 1 字节存储,而对于其他字符则使用 2 到 4 字节存储。它的优势在于全球各国语言和符号都能统一表示,且兼容 ASCII 编码,广泛应用于 Web 开发和数据库存储中。

在 PHP 中,UTF-8 编码通常用于处理多语言网站的数据交换和存储,尤其是在数据库和浏览器之间传输数据时。如果编码设置不正确,很容易导致乱码问题。

为什么要使用 mysqli::set_charset

在 PHP 中,如果你使用的是 MySQL 数据库并且通过 mysqli 扩展来进行数据库连接和操作,确保数据库连接使用 UTF-8 编码非常重要。否则,即使你的数据库表和字段设置了 UTF-8 编码,数据传输过程中仍然可能因为编码不匹配而出现乱码问题。

mysqli::set_charset 方法允许你为当前的数据库连接设置字符集。通过设置字符集为 UTF-8,确保了在数据查询和插入过程中,PHP 与 MySQL 数据库之间能够正确地进行编码和解码。

如何正确使用 mysqli::set_charset 设置 UTF-8 编码?

  1. 创建数据库连接:

    使用 mysqli_connectnew mysqli() 方法连接数据库。

  2. 设置字符集:

    在成功连接到数据库后,使用 mysqli::set_charset 方法来设置字符集为 UTF-8。

代码示例

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 1. 创建数据库连接</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'localhost'</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'root'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-variable">$dbname</span></span><span> = </span><span><span class="hljs-string">'your_database'</span></span><span>;

</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);

</span><span><span class="hljs-comment">// 检查连接是否成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"连接失败: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 2. 设置字符集为 UTF-8</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">set_charset</span></span><span>(</span><span><span class="hljs-string">"utf8"</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"错误: 无法设置字符集 UTF-8: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;error;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"当前字符集: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">character_set_name</span></span><span>();
}

</span><span><span class="hljs-comment">// 3. 执行查询等操作</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM your_table"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>-&gt;num_rows &gt; </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">while</span></span><span>(</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"数据: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'column_name'</span></span><span>] . </span><span><span class="hljs-string">"&lt;br&gt;"</span></span><span>;
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"没有数据"</span></span><span>;
}

</span><span><span class="hljs-comment">// 4. 关闭连接</span></span><span>
</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

代码解析:

  1. 数据库连接:
    使用 new mysqli() 创建了一个数据库连接,并检查连接是否成功。如果连接失败,则通过 die() 终止程序,并显示错误信息。

  2. 设置字符集:
    使用 $conn->set_charset("utf8") 设置连接字符集为 UTF-8。此时,PHP 和 MySQL 数据库之间的所有数据传输都会使用 UTF-8 编码。如果设置失败,可以通过 $conn->error 输出错误信息。

  3. 执行查询:
    查询 your_table 表中的数据,确保返回的数据能正确显示 UTF-8 编码的字符。

  4. 关闭连接:
    最后,使用 $conn->close() 关闭数据库连接。

注意事项

  • 数据库表的字符集:
    除了在 PHP 中设置字符集外,还需要确保数据库表和字段的字符集也是 UTF-8。可以通过 SHOW CREATE TABLE 查看表的字符集,或者通过以下 SQL 语句修改表的字符集:

    <span><span><span class="hljs-keyword">ALTER</span></span><span> </span><span><span class="hljs-keyword">TABLE</span></span><span> your_table </span><span><span class="hljs-keyword">CONVERT</span></span><span> </span><span><span class="hljs-keyword">TO</span></span><span> </span><span><span class="hljs-type">CHARACTER</span></span><span> </span><span><span class="hljs-keyword">SET</span></span><span> utf8 </span><span><span class="hljs-keyword">COLLATE</span></span><span> utf8_general_ci;
    </span></span>
  • 浏览器编码:
    确保在 HTML 页面的 <head> 标签中设置了正确的字符集,避免浏览器显示乱码。通常可以使用以下标签设置:

    <span><span><span class="hljs-tag">&lt;<span class="hljs-name">meta</span></span></span><span> </span><span><span class="hljs-attr">charset</span></span><span>=</span><span><span class="hljs-string">"UTF-8"</span></span><span>&gt;
    </span></span>
  • MySQL 服务器默认字符集:
    如果你希望 MySQL 服务器默认使用 UTF-8 编码,可以在 MySQL 配置文件 my.cnfmy.ini 中设置:

    <span><span><span class="hljs-section">[mysqld]</span></span><span>
    </span><span><span class="hljs-attr">character-set-server</span></span><span> = utf8
    </span><span><span class="hljs-attr">collation-server</span></span><span> = utf8_general_ci
    </span></span>

总结

使用 mysqli::set_charset 设置 UTF-8 编码是确保 PHP 与 MySQL 数据库之间正确处理多语言数据的一个重要步骤。通过正确配置字符集,不仅可以避免乱码问题,还能保证数据在传输过程中不会丢失或错误编码。确保数据库表和字段的字符集也为 UTF-8,才能在整个应用中保持一致的编码设置,进而提高项目的兼容性和可扩展性。