我一直在尝试开始使用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
答案 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查询。如果您想从数据库中提取模型对象,这不太合适,但它确实允许您解决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一起使用的字符实例来解决这个问题。转换所有内容可能很麻烦,但我认为值得一试。