【问题标题】:Doctrine2 case-sensitive queryDoctrine2 区分大小写的查询
【发布时间】:2023-03-15 01:55:02
【问题描述】:

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

正在工作。有什么想法吗?

【问题讨论】:

    标签: doctrine-orm case-sensitive


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      对于那些无法更改其数据库排序规则的人,您可以使用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');
      

      然后你就可以像这样在你的 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: 'DoctrineExtensions\Query\Mysql\Binary'
      

      更多详情请见Symfony Doctrine Configuration Documentation

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 2012-09-22
          相关资源
          最近更新 更多