学说2:从MySQL表中获取奇怪的字符

时间:2017-07-07 01:43:19

标签: mysql pdo doctrine

我试图显示这样的文字:

1ºA

存储在MySQL表('level')中。

使用此代码查询表'level'后:

/**
 * @Route("/list-level", name="list_level")
 */
public function listAction(Request $request)
{
    $em = $this->getDoctrine()->getEntityManager();

    $levels = $em->getRepository('AppBundle:Level')->findAll();
    var_dump($levels[0]->getName());
    die("fasf");

var_dump()会返回此信息:

enter image description here

我正在使用Symfony,因此与数据库连接相关的信息缓存在文件var/cache/prod/appProdProjectContainer中。所以我打开它来检查charset参数的值,我发现了这个:

protected function getDoctrine_Dbal_DefaultConnectionService()
{
    $a = new \Symfony\Bridge\Doctrine\ContainerAwareEventManager($this);
    $a->addEventListener(array(0 => 'loadClassMetadata'), ${($_ = isset($this->services['doctrine.orm.default_listeners.attach_entity_listeners']) ? $this->services['doctrine.orm.default_listeners.attach_entity_listeners'] : $this->get('doctrine.orm.default_listeners.attach_entity_listeners')) && false ?: '_'});

    return $this->services['doctrine.dbal.default_connection'] = ${($_ = isset($this->services['doctrine.dbal.connection_factory']) ? $this->services['doctrine.dbal.connection_factory'] : $this->get('doctrine.dbal.connection_factory')) && false ?: '_'}->createConnection(array('driver' => 'pdo_mysql', 'host' => 'localhost', 'port' => NULL, 'dbname' => 'my_javiergarpe1979', 'user' => 'javiergarpe1979', 'password' => '*******', 'charset' => 'UTF8', 'driverOptions' => array(), 'defaultTableOptions' => array()), new \Doctrine\DBAL\Configuration(), $a, array());
}

正如您在该功能上看到的那样,写有:'charset' => 'UTF8',所以.. 为什么我没有得到正确的字符?

4 个答案:

答案 0 :(得分:3)

您可能需要更新driverOptions中的var/cache/prod/appProdProjectContainer

protected function getDoctrine_Dbal_DefaultConnectionService()
{
    $a = new \Symfony\Bridge\Doctrine\ContainerAwareEventManager($this);
    $a->addEventListener(array(0 => 'loadClassMetadata'), ${($_ = isset($this->services['doctrine.orm.default_listeners.attach_entity_listeners']) ? $this->services['doctrine.orm.default_listeners.attach_entity_listeners'] : $this->get('doctrine.orm.default_listeners.attach_entity_listeners')) && false ?: '_'});

    return $this->services['doctrine.dbal.default_connection'] = ${($_ = isset($this->services['doctrine.dbal.connection_factory']) ? $this->services['doctrine.dbal.connection_factory'] : $this->get('doctrine.dbal.connection_factory')) && false ?: '_'}->createConnection(array('driver' => 'pdo_mysql', 'host' => 'localhost', 'port' => NULL, 'dbname' => 'my_javiergarpe1979', 'user' => 'javiergarpe1979', 'password' => '*******', 'charset' => 'UTF8', 'driverOptions' => array('1002'=> "SET NAMES 'UTF8' COLLATE 'utf8_general_ci'"), 'defaultTableOptions' => array()), new \Doctrine\DBAL\Configuration(), $a, array());
}

设置'driverOptions' => array('1002'=> "SET NAMES 'UTF8' COLLATE 'utf8_general_ci'")而不是'driverOptions' => array()

答案 1 :(得分:2)

可能标题中没有<meta charset=UTF-8>是一个浏览器问题。

请参阅http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored

中的“黑钻石”

º是“MASCULINE ORDINAL INDICATOR”。

如果您从表中SELECT HEX(...),您应该会看到C2BA该字符。或31C2BA41 1ºA。如果是,则将其正确存储为utf8(或utf8mb4)。

案例1(原始字节不是UTF-8):

  • 要存储的字节不编码为utf8。解决这个问题。
  • SET NAMESINSERT的连接(或SELECT)不是utf8 / utf8mb4。解决这个问题。
  • 另外,检查数据库中的列是CHARACTER SET utf8(或utf8mb4)。

案例2(原始字节为UTF-8):

  • SET NAMES的连接(或SELECT)不是utf8 / utf8mb4。解决这个问题。
  • 另外,检查数据库中的列是CHARACTER SET utf8(或utf8mb4)。

如果您有其他问题,请提供SHOW CREATE TABLE

答案 2 :(得分:1)

有多点可能会出错。

  1. 检查您在数据库中使用的字符集。还要检查表格,因为它们可以有自己的编码 有关详细信息,请参阅此答案:https://stackoverflow.com/a/202246/2232127
  2. 检查您用于连接的字符集(您已经设置了这个)
  3. 检查显示页面的字符集。您可以通过此元标记设置此项:<meta charset="UTF-8">标记中的<head>
  4. 您必须使用支持此字符的字体。大多数字体不应显示<?>字符,但在这种情况下可能会显示与°类似的内容。

答案 3 :(得分:1)

检查数据库中表的字符集。可能不是UTF-8。