Doctrine2大小写敏感查询

6

由于某些原因,我需要在MySql + doctrine 2中查询“区分大小写”。这是否可能?

都不行。

$em->find('UserEn', 'Bob')

非也
$q = $this->em->createQuery('select u from UserEn u where u.name = :name');
$q->setParameter('name', 'Bob');
$result = $q->getResult();

正在工作。有什么想法吗?

3个回答

15

也许你正在使用以"_ci"结尾的MySQL排序规则,例如"utf8_general_ci"。这里的"ci"代表"不区分大小写"。

如果是这种情况,那么这不是Doctrine的问题,而是MySQL的问题。

请参阅http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

"默认字符集和排序规则为latin1和latin1_swedish_ci,因此非二进制字符串比较默认不区分大小写。"


3
对于那些无法更改数据库排序规则的人,您可以使用BINARY运算符来强制对条件进行区分大小写。

BINARY运算符将其后面的字符串转换为二进制字符串。 这是一种简单的方法,可以通过逐字节而不是逐字符进行比较。BINARY还会导致尾随空格有意义。

请参见MySQL BINARY Operator了解更多详细信息。
要在Doctrine DQL中启用BINARY运算符,可以安装Doctrine扩展库。或者像这样创建自己的二进制字符串函数。
use Doctrine\ORM\Query\AST\Functions\FunctionNode,
    Doctrine\ORM\Query\Lexer;

class Binary extends FunctionNode
{
    private $stringPrimary;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->stringPrimary = $parser->StringPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'BINARY('.$sqlWalker->walkSimpleArithmeticExpression($this->stringPrimary).')';
    }
}

接下来,您需要在Doctrine配置中注册binary字符串函数。您可以在配置设置中这样做,也可以根据需要添加它,如下所示。

$em->getConfiguration()->addCustomStringFunction('binary', 'DoctrineExtensions\\Query\\Mysql\\Binary');

然后,您就可以在DQL中使用binary(...)函数,例如:
$q = $em->createQuery('select u from UserEn u where binary(u.name) = :name');
echo $q->getSQL();
/* SELECT ... FROM ... WHERE BINARY(u0_.name) = ? */

要使用Symfony框架添加“binary”字符串函数,请在您的“config.yml”文件中按如下方式更改“doctrine.orm.entity_managers.%entity_manager%.dql”设置。
doctrine:
    orm:
      #...
      entity_managers:
          #...
          default:
              #...
              dql:
                  #...
                  string_functions:
                      #...
                      binary: 'DoctrineExtensions\Query\Mysql\Binary'

请参考Symfony Doctrine Configuration Documentation获取更多细节信息。

0

这不是Doctrine的问题,您需要将表格排序更改为二进制,然后大小写敏感就可以工作了。
执行alter table并更改此内容
CHARSET=utf8 COLLATE=utf8_general_ci
更改为
CHARSET=utf8 COLLATE=utf8_bin


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接