由于某些原因,我需要在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();
正在工作。有什么想法吗?
由于某些原因,我需要在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"代表"不区分大小写"。
如果是这种情况,那么这不是Doctrine的问题,而是MySQL的问题。
请参阅http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
"默认字符集和排序规则为latin1和latin1_swedish_ci,因此非二进制字符串比较默认不区分大小写。"
BINARY
运算符来强制对条件进行区分大小写。
请参见MySQL BINARY Operator了解更多详细信息。BINARY运算符将其后面的字符串转换为二进制字符串。 这是一种简单的方法,可以通过逐字节而不是逐字符进行比较。BINARY还会导致尾随空格有意义。
BINARY
运算符,可以安装Doctrine扩展库。或者像这样创建自己的二进制字符串函数。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).')';
}
}
接下来,您需要在Doctrine配置中注册binary
字符串函数。您可以在配置设置中这样做,也可以根据需要添加它,如下所示。
$em->getConfiguration()->addCustomStringFunction('binary', 'DoctrineExtensions\\Query\\Mysql\\Binary');
binary(...)
函数,例如:$q = $em->createQuery('select u from UserEn u where binary(u.name) = :name');
echo $q->getSQL();
/* SELECT ... FROM ... WHERE BINARY(u0_.name) = ? */
doctrine:
orm:
#...
entity_managers:
#...
default:
#...
dql:
#...
string_functions:
#...
binary: 'DoctrineExtensions\Query\Mysql\Binary'
这不是Doctrine的问题,您需要将表格排序更改为二进制,然后大小写敏感就可以工作了。
执行alter table并更改此内容
CHARSET=utf8 COLLATE=utf8_general_ci
更改为
CHARSET=utf8 COLLATE=utf8_bin