使用Phalcon无法从MySql返回中文字符

时间:2014-02-10 22:11:04

标签: php mysql encoding utf-8 phalcon

我一直在尝试开始使用Phalcon,但是我已经被困了几天试图查询我的数据库。如果我找不到解决这个问题的方法,我将不得不继续前进。

目标表使用inno-db并且是utf-8编码的。表有两列:一列是索引值,另一列是单个(唯一)东亚字符。当尝试使用utf-8编码的中文字符检索记录时,Phalcon返回0条记录。此外,使用索引值检索记录时,相应的字符值将作为问号返回(常规问号,而不是浏览器用作无法识别字符占位符的问号)。

$characters = Characters::find("indCharacter = 乱");

返回此错误:

"PhalconException: Scanning error before '��' when parsing: SELECT [Characters].* FROM [Characters] WHERE indCharacter = 乱 (64)"

在实际字符0周围使用单引号返回。

我使用命令行,phpmyadmin和workbench运行完全相同的查询,所有这些查询都在同一个环境中。所有正确返回的记录。

我还仔细检查了原始查询值是否为utf-8编码,并且表中的所有数据都是utf-8编码。

Phalcon:1.2.6
Php:5.4.11

3 个答案:

答案 0 :(得分:5)

使用Phalcon的Pdo Mysql适配器创建数据库连接时,必须明确设置字符编码。这是一个类似于Phalcon教程中的示例,只是我添加了"charset"

$di->set('db', function() use ($config) {
    return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
        "host" => "myhost",
        "username" => "myusername",
        "password" => "mypassword",
        "dbname" => "mydbname",
        "charset" => "utf8"
    ));
});

我以前查看了各种适配器类的文档,但找不到与设置数据库连接的编码有关的任何内容。我(错误地)假设编码检测是在内部处理的。

答案 1 :(得分:0)

编辑:刚看到有关单引号的说明。您可以尝试参数化查询,如下所示。

您需要在匹配的字符串周围加上引号。 Model::find()接受一个参数的语法类似于MySQL WHERE子句中通常使用的语法。

$characters = Characters::find("indCharacter = '乱'");

模型finding records的文档显示了这一点。


参数化查询

请注意,如果使用参数化查询,则可以跳过添加引号和转义:

$characters = Characters::find([
    "indCharacter = :char:",
    'bind' => [
        'char' => '乱'
    ]
]);


普通MySQL查询

或者,您可以使用数据库适配器运行纯MySQL查询。如果您想从数据库中提取模型对象,这不太合适,但它确实允许您解决PHQL问题或在需要时跳过ORM。例如REGEXP导致PHQL解析器出错,但它在MySQL中完全有效。

/** @var Phalcon\Db\Adapter\Pdo\Mysql $connection */
$connection = $this->di->get('db');
$result = $connection->query("SELECT * FROM characters WHERE indCharacter = '乱'");

答案 2 :(得分:-2)

小注意......我没有对Falcon做过任何事情,但是在使用MySQL / PHP时我确实遇到了类似的错误。像ã和í这样的人物不起作用。

您可以尝试使用Unicode NCR。对于乱,它是乱。我找到了this网站,将中文字符转换为NCR。

同样,这可能会奏效。我的问题是,将事物输入到表单中并添加到数据库中,我通过替换不能与其NCR一起使用的字符实例来解决这个问题。转换所有内容可能很麻烦,但我认为值得一试。