2012-08-26 94 views
3

由于某种原因我需要在MySql + doctrine中查询'区分大小写'2.是否有可能?Doctrine2区分大小写的查询

既不

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

也不

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

工作。任何想法?

回答

10

也许您正在使用以“_ci”结尾的MySQL归类,如“utf8_general_ci”。 “ci”代表“不区分大小写”。 如果是这样的话,它不是一个学说问题,而是一个MySQL问题。

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

“默认字符集和校对规则是LATIN1和latin1_swedish_ci,所以非二进制字符串比较是区分大小写的默认。”

0

这不是学说问题,你必须将表格整理更改为二进制,然后区分大小写。
不要alter table和改变这种
CHARSET = UTF8 COLLATE = utf8_general_ci
这个
CHARSET = UTF8 COLLATE = utf8_bin

1

对于那些无法改变自己的数据库排序规则,你可以使用BINARY运营商为了强制标准的大小写敏感性。

BINARY运算符将后面的字符串转换为二进制字符串。 这是一种简单的方法,可以逐字节地完成比较,而不是逐个字符地完成。 BINARY还会导致尾部空格 变得非常重要。

有关更多详细信息,请参阅MySQL BINARY Operator

要在Doctrine DQL中启用BINARY运算符,您可以安装Doctrine Extensions library。 或者像这样创建自己的二进制字符串函数。

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).')'; 
    } 
} 

接下来,您需要在您的原则配置中注册binary字符串函数。您可以在您的配置设置中进行此操作,或按照需要添加它。

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

然后,你将能够使用binary(...)功能在您的DQL像这样。

$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

最佳答案的话题:) –