В oracle есть функция "convert" для преобразования из одной кодировки в другую.Я написал пользовательскую функцию для доктрины (преобразование столбца из ISO-8859-2 в UTF-8:
<?php
namespace AppBundle\DQL;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
class ConvertFunction extends FunctionNode
{
public $stringPrimary;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return $sqlWalker->getConnection()->getDatabasePlatform()->getUpperExpression(
"CONVERT(".$sqlWalker->walkSimpleArithmeticExpression($this->stringPrimary).", 'EE8ISO8859P2', 'UTF8')"
);
}
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);
}
}
, когда я его использую, он ничего не ищет, но когда я запускаю sql в БД, он работает.
Изменяет ли symfony / doctrine кодировку переменной?
edit:
(моя пользовательская функция объявляется как convertToISO8859): Когда я запускаю (в symfony):
select * from tables where convertToISO8859(name) = 'Jesień'
Он ничего не возвращает, но в Symfony Profiler правильно показывает sql:
select * from tables where upper(convert(name), 'EE8ISO8859P2', 'UTF8') = 'Jesień'