5

出于某种原因,我需要在 MySql + 学说 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

也许您正在使用以“_ci”结尾的 MySQL 排序规则,例如“utf8_general_ci”。“ci”代表“不区分大小写”。如果是这种情况,则不是 Doctrine 问题,而是 MySQL 问题。

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

“默认字符集和排序规则是 latin1 和 latin1_swedish_ci,因此默认情况下非二进制字符串比较不区分大小写。”

于 2012-08-26T13:06:50.177 回答
3

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

BINARY 运算符将其后面的字符串转换为二进制字符串。这是一种强制比较逐字节而不是逐字符进行比较的简单方法。BINARY 还会导致尾随空格很重要。

有关更多详细信息,请参阅MySQL BINARY 运算符

BINARY在 Doctrine DQLs 中启用操作符,您可以安装Doctrine Extensions 库。或者像这样创建自己的二进制字符串函数。

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

binary使用 Symfony 框架添加字符串函数,请在config.yml文件中更改doctrine.orm.entity_managers.%entity_manager%.dql设置,如下所示。

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

有关详细信息,请参阅Symfony Doctrine 配置文档

于 2016-08-11T16:59:33.280 回答
0

这不是教义问题,您必须将表排序规则更改为二进制,然后区分大小写即可。
更改表并将此
CHARSET=utf8 COLLATE=utf8_general_ci
更改为此
CHARSET=utf8 COLLATE=utf8_bin

于 2013-04-13T06:29:23.963 回答