PHP / MySQL 中的特殊字符

2022-08-30 15:51:13

我在数据库中有包含特殊字符的单词(主要是西班牙语,如波浪号)。在数据库中,所有内容都保存并使用PHPmyAdmin正确显示,但是当我获取数据(使用PHP)并在浏览器中显示它时,我得到一个奇怪的字符,例如带有正方形的“?”...我需要一个通用的修复程序,这样我就不需要每次都转义每个字符,而且我还能够将PHP表单中的特殊西班牙语字符插入到数据库中......

HTML 是正确的:

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

所有表和数据库都设置为 utf8_spanish

我得到的角色:

任何建议???

谢谢!!!


答案 1

我只想提供有关vartec提出的解决方案的更多详细信息,该解决方案(取决于您的MySQL安装)是解决您问题的最正确解决方案。首先,MySQL中的字符集/编码问题是一个有点复杂的主题,在MySQL手册第9.1章“字符集支持”中对此进行了广泛的介绍。在您的情况下,特别是9.1.4。“连接字符集和排序规则”将是最相关的。

简而言之:MySQL必须知道客户端应用程序(从PHP脚本的数据库开始)期望的字符集/编码,因为它会将所有字符串数据从服务器,数据库,表或列级别定义的内部字符集/编码转换为连接字符集/编码。您在客户端使用UTF-8,因此必须告诉MySQL您使用的是UTF-8。这是由MySQL命令完成的,该命令必须在打开连接时作为第一个查询发送。根据您的安装和您在PHP脚本中使用的MySQL客户端库,这可以在每次连接时自动完成。SET NAMES 'utf8'

如果您使用PDO,只需设置配置参数即可

$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

使用mysqli更改客户端字符集/编码更加简单:

$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");

我希望这将有助于使整个事情更容易理解。


答案 2

连接后立即出现问题:SET NAMES 'utf8'

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");

推荐