27

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

HTML 是正确的:

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

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

我得到的角色:�</p>

有什么建议么???

谢谢!!!

4

15 回答 15

35

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

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

如果您使用 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");

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

于 2009-03-11T09:15:44.447 回答
14

连接后立即发出SET NAMES 'utf8'

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
于 2009-03-11T08:56:25.757 回答
11

让 MySQL 自动翻译它

$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);

http://es.php.net/manual/en/function.mysql-set-charset.php

编辑:从我收集到的评论中,这实际上是用 latin1 编码的,所以

mysql_set_charset('latin1_spanish_ci',$conn);
于 2009-03-11T08:59:33.923 回答
5

我从某个地方发现了这个,从那时起就一直在使用它而没有想太多。

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
于 2013-05-05T19:24:07.447 回答
4

将 HTML 字符集更改为 ISO-8859-1 解决了问题!愚蠢的

于 2009-03-11T10:13:35.273 回答
3

神圣的废话..这让我发疯了。我试图做同样的事情。我添加了一个 utf-8 编码的 HTML 标头。几个小时后,mysqli_set_charset() 救了我,但我很高兴我现在可以使用它

另一个尝试编码特殊字符和重音的函数是 htmlentities()

于 2009-11-13T11:34:41.623 回答
3

你可以简单地做:

$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
于 2014-12-25T23:43:00.253 回答
2

在您的 HTML 中打开 unicode 编码。

于 2009-03-11T08:51:40.183 回答
2

在处理特殊字符时,我总是注意以下事项:

  • 数据库、表和字段字符集都设置为 utf8_general_* 或 utf8_unicode_*
  • 我确保我的编辑器使用正确的字符集保存 PHP 文件
  • 我将 php.ini 中的 default_charset 设置为 UTF-8
  • 我发送一个 Content-Type: text/html; charset=UTF-8 标头
  • META 标记中的字符集是 UTF-8(这被 Content-Type HTTP 标头覆盖)
  • 连接到 MySQL 时,我发出以下查询:
    • 设置名称 utf8
    • 设置字符集 utf8
    • SET COLLATION_CONNECTION="utf8_general_ci"/"utf8_general_ci"
于 2009-03-11T09:10:02.353 回答
2

你确定你的数据库中有 UTF8 数据吗?

于 2009-03-11T10:00:11.453 回答
2

对我有用的答案是 Stefan Gehrig 发布的答案:

$mysqli->set_charset("utf8");

在定义连接和解决问题后,我只需要添加该行!:)

(我正在发布答案,因为我无法发表评论......)。

于 2018-03-06T16:38:22.030 回答
0

我的解决方案是:执行上述所有操作,但我也使用记事本++,并且文件必须像这样保存:转到 manu 选项卡中的编码并保存文件->在 utf8 中编码

于 2013-08-11T16:20:20.953 回答
0

有趣的是,这段代码对我不起作用:

$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1

但是,在条件内设置字符集是有效的:

if (!mysqli_set_charset($link, "utf8")) {
    printf("Error loading character set utf8: %s\n", mysqli_error($link));
    exit();
} else {
    printf("Current character set: %s\n", mysqli_character_set_name($link));
    //shows utf8
}

我的设置:

$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64
于 2018-08-13T09:22:57.937 回答
0

这里的这个答案对于那些使用像我这样的MySQLi函数通过PHP的程序方式连接到他们的MySQLMariadb数据库的人来说会派上用场。

这是人们如何以程序方式进行操作的方法。见下文;

<?php

$host = "localhost";
$user = "user";
$passwd = "password";
$database = "database";

$con = mysqli_connect($host, $user, $passwd, $database);
mysqli_set_charset($con, "utf8");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}

?>
于 2020-04-19T14:34:36.380 回答
0

以下答案对于那些使用MySQLi函数从PHP连接到他们的MySQLMariadb数据库的人可能很有价值,就像我在不通过PDOPHP 数据对象)连接时经常做的那样。

这是您如何以程序方式进行操作的方法。见下文;

<?php

$host = "localhost";
$user = "user";
$passwd = "password";
$database = "database";

$con = mysqli_connect($host, $user, $passwd, $database);
mysqli_set_charset($con, "utf8");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}

?>
于 2020-04-22T21:35:38.087 回答