5

何らかの理由で、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();

仕事中。何か案が?

4

3 に答える 3

14

「utf8_general_ci」のように、「_ci」で終わるMySQL照合を使用している可能性があります。「ci」は「大文字と小文字を区別しない」の略です。この場合、これはDoctrineの問題ではなく、MySQLの問題です。

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivevity.htmlを参照してください

「デフォルトの文字セットと照合はlatin1とlatin1_swedish_ciであるため、非バイナリ文字列の比較ではデフォルトで大文字と小文字が区別されません。」

于 2012-08-26T13:06:50.177 に答える
3

データベースの照合を変更できない場合は、BINARY演算子を使用して、大文字と小文字の区別を基準に強制できます。

BINARY演算子は、それに続く文字列を2項文字列にキャストします。これは、文字ごとではなくバイトごとに比較を強制する簡単な方法です。BINARYを使用すると、末尾のスペースも重要になります。

詳細については、 MySQLの二項演算子を参照してください。

BINARYDoctrine DQLでオペレーターを有効にするには、 DoctrineExtensionsライブラリをインストールします。または、そのように独自のバイナリ文字列関数を作成します。

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次に、文字列関数をDoctrine構成に登録する必要があります。構成設定でこれを行うか、必要に応じて追加することができます。

$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) = ? */

binarySymfony Frameworkを使用して文字列関数を追加するには、ファイルで次のように設定をconfig.yml変更します。doctrine.orm.entity_managers.%entity_manager%.dql

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

詳細については、 SymfonyDoctrine構成ドキュメントを参照してください。

于 2016-08-11T16:59:33.280 に答える
0

テーブルの照合をバイナリに変更する必要があるのはDoctrineの問題ではなく、大文字と小文字が区別されます。
テーブルを変更して、この
CHARSET = utf8 COLLATE=utf8_general_ci
をこの
CHARSET=utf8 COLLATE=utf8_binに変更してください

于 2013-04-13T06:29:23.963 に答える