为什么我的MySQL数据库中没有正确存储突出的字符?

时间:2012-10-01 20:02:47

标签: php utf-8 character-encoding drupal-7 doctrine-orm

我有一个drupal表单,使用Doctrine库将用户输入保存到MySQL数据库中。问题是如果用户输入具有突出显示的字符,则它们在DB中看起来不太好。例如,Sempé变为Sempé。这对我来说很奇怪,因为:

  • 它存储的字段是utf8:varchar(20) COLLATE utf8_swedish_ci NOT NULL,
  • 该表格也是utf8:ENGINE=InnoDB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci
  • 我所有的PHP脚本,包括告诉drupal将哪些字段添加到表单中的脚本都保存为utf-8
  • drupal创建的表单接受utf8:<form enctype="multipart/form-data" action="/drupal/identification" method="post" id="form-identification" accept-charset="UTF-8">
  • drupal创建的页面以utf8发送:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • php-&gt; mysql连接设置为utf8:

    $dbParams = array("driver" => "pdo_mysql",
        "host" => variable_get("dbManip_host"),
        "user" => variable_get("dbManip_user"),
        "password" => variable_get("dbManip_password"),
        "dbname" => variable_get("dbManip_dbName"),
        "charset" => "utf8");
    

我也尝试过:

  • default_charset = "utf8"添加到 php.ini
  • 在保存之前传递utf8_encode中的表单数据
  • 在保存之前传递mb_convert_encoding中的表单数据

但没有一个有效。

我在这里遗漏了什么吗?

更新

我查看了浏览器发送到服务器的标头,发现$_SERVER['HTTP_ACCEPT_CHARSET'] === null

2 个答案:

答案 0 :(得分:1)

您应该尝试在实体管理器的配置中添加一个名为charset的额外参数:

$conn = array(
  'driver' => 'pdo_mysql',
  'host' => 'hostname',
  'user' => 'user',
  'password' => 'pass',
  'dbname' => 'dbname',
  'charset' => 'utf8'
);

$entityManager = \Doctrine\ORM\EntityManager::create($conn, $config);

答案 1 :(得分:1)

在通过给定的PHP MySQL链接提交任何其他查询之前,请尝试:

mysql_query('SET NAMES UTF8');

此声明表明通过相同的MySQL链接提交的其他查询将采用UTF8字符集。

如果您想稍后检索MySQL数据并通过PHP发布到网页,请务必在HTTP标头中设置字符集:

header('Content-type: text/html; charset=utf-8');

...并转换为显示内容中的HTML实体:

echo mb_convert_encoding($mysql_col_str, 'HTML-ENTITIES', 'UTF-8');

(这个最终语句假定已经定义了一个变量 $ mysql_col_str ,其中包含MySQL查询返回的UTF8值)