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

"utf8_general_ci"와 같이 "_ci"로 끝나는 MySQL 데이터 정렬을 사용하고있을 수도 있습니다. "ci"는 대소 문자를 구분하지 않습니다. 이 경우 Doctrine 문제가 아니라 MySQL 문제입니다.

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html는 "기본 문자 집합 및 정렬은 라틴과 latin1_swedish_ci, 그래서 이진이 아닌 문자열 비교는 기본적으로 대소 문자를 구분"을 참조하십시오.

0

Doctrine 문제가 아니므로 테이블 데이터 정렬을 바이너리로 변경해야 대소 문자를 구분할 수 있습니다.
테이블을 변경하고이
CHARSET = UTF8 부씩 자신의 데이터베이스 데이터 정렬을 변경할 수 없습니다 그 사람들을 위해 = utf8_bin

1

에 utf8_general_ci
, 당신이 사용할 수 =이
CHARSET = UTF8 부씩을 변경 함 BINARY 연산자를 사용하여 조건에 대소 문자를 구분합니다.

BINARY 연산자는 그 뒤에 오는 문자열을 2 진 문자열로 변환합니다. 이것은 비교가 문자 단위가 아닌 바이트 단위로 이되도록하는 쉬운 방법입니다. 또한 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'); 

그럼 당신은 다음처럼 DQL에 binary(...) 기능을 사용할 수 있습니다.

$q = $em->createQuery('select u from UserEn u where binary(u.name) = :name'); 
echo $q->getSQL(); 
/* SELECT ... FROM ... WHERE BINARY(u0_.name) = ? */ 

은과 같이 설정 doctrine.orm.entity_managers.%entity_manager%.dql을 변경하려면 config.yml 파일의 심포니 프레임 워크를 사용하여 binary 문자열 기능을 추가합니다.

doctrine: 
    orm: 
     #... 
     entity_managers: 
      #... 
      default: 
       #... 
       dql: 
        #... 
        string_functions: 
         #... 
         binary: 'DoctrineExtensions\Query\Mysql\Binary' 

은 자세한 항목

+0

우수 답변에 대한 Symfony Doctrine Configuration Documentation를 참조하십시오 : –