2012-08-26 92 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

最佳答案的話題:) –