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