原则 2 区分大小写的查询



出于某种原因,我需要在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();

正在工作。知道吗?

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

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

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

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

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

请参阅 MySQL 二进制运算符 了解更多详情。

若要在 Doctrine DQL 中启用 BINARY 运算符,可以安装原则扩展库。或者像这样创建自己的二进制字符串函数。

use DoctrineORMQueryASTFunctionsFunctionNode,
    DoctrineORMQueryLexer;
class Binary extends FunctionNode
{
    private $stringPrimary;
    public function parse(DoctrineORMQueryParser $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(DoctrineORMQuerySqlWalker $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) = ? */

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

doctrine:
    orm:
      #...
      entity_managers:
          #...
          default:
              #...
              dql:
                  #...
                  string_functions:
                      #...
                      binary: 'DoctrineExtensionsQueryMysqlBinary'

参见Symfony Doctrine配置文档了解更多详情

这不是

教义问题,您必须将表排序规则更改为二进制,然后区分大小写即可。
更改表并更改此内容
字符集=UTF8 COLLATE=utf8_general_ci
对此
字符集=UTF8 COLLATE=utf8_bin

相关内容

  • 没有找到相关文章

最新更新