Nano Hash - криптовалюты, майнинг, программирование

Параметр пользовательских функций DQL Symfony 2/Doctrine имеет ограничение длины строки?

Я создал свою пользовательскую функцию DQL для Doctrine DQL:

class Translate extends FunctionNode {
    public $field;

    public function getSql(SqlWalker $sqlWalker) {
        $query = "TRANSLATE(" . $this->field->dispatch($sqlWalker) . ", 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY')";
        return $query;
    }

    public function parse(Parser $parser) {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->field = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

Кажется, это хорошо работает при использовании.

Но если строковый параметр содержит более 307 символов, он не работает. Ошибки нет, но скрипт завершается.

$query = $this->createQueryBuilder('...');
$query->addSelect("TRANSLATE('less than 307 chars')"); // working
$query->addSelect("TRANSLATE('more than 307 chars')"); // NOT working

Как я могу использовать более 307 символов?


  • Вы пытались запустить только SQL с более чем 307 символов? Возможно, проблема в максимальном размере запроса. 27.03.2013
  • Да и ограничений нет. 27.03.2013
  • And if i modify my DQL function (Translate class) to directly put my string, it's working : $query = TRANSLATE('raw string with more than 307 chars working', 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY'); 27.03.2013
  • Рассматривали ли вы возможность написать тестовый пример, который проверяет, заключается ли проблема в сгенерированном SQL или в СУБД? 29.03.2013
  • Что такое сообщение об ошибке исключения? 22.07.2013
  • Старый вопрос, не знаю ответа DQL, но: похоже, что простой iconv для ASCII будет делать то же самое без необходимости указывать все символы отдельно. 14.01.2014
  • Возможно, вы захотите взглянуть на DoctrineExtensions как на возможное решение вашей исходной проблемы, которая может быть связана с слагификацией. См. также https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sluggable.md#transliterator 14.03.2014
  • Вы пытались сохранить этот текст только в ASCII в другом столбце вместо использования этой функции? 26.04.2014
  • Я попытался воссоздать вашу проблему и не смог. Я попробовал «SELECT TRANSLATE(c.notes)» из DemoBundle:Entity c, где c.id = 3, где «c.notes» было длинным текстовым полем. Я также попробовал 'SELECT TRANSLATE(verylongstring...) из CranaContactsBundle:Contact c, где c.id = 3'. Единственное изменение, которое я внес в ваш пользовательский класс функций, заключалось в использовании SQL-функции REPLACE() вместо TRANSLATE(). Можете ли вы опубликовать весь запрос, который вы выполняете, с SQL? 20.05.2014
  • Чем заканчивается сценарий? 10.07.2014
  • Это не имеет ничего общего с ограничением в 307 символов. Вероятно, у вас есть недопустимый символ в позиции 308 в вашей базе данных. Попробуйте SQL с :substitution_variable вместо того, чтобы вводить текст в свой SQL. Вероятно, вы получите более поддающееся отладке сообщение об ошибке. 15.07.2014
  • Возвращается ли значение из $this->field->dispatch($sqlWalker) в одинарных кавычках? 20.09.2014

Ответы:


1

Как уже объяснил wrikken, транслитерацию следует выполнять с помощью iconv, поскольку это сэкономит ресурсы вашего сервера.

вот простая функция, которая будет транслитерировать (преобразовывать нелатинские символы в их ближайшие представления в латинской кодировке) строку.

function transliterateString($str)
{
    $serverLocale = setlocale(LC_CTYPE, 0);
    setlocale(LC_CTYPE, 'en_US.UTF8');
    // transliterate the string using iconv
    $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); 
    setlocale(LC_CTYPE, $serverLocale); //  return the locale to what it was before
    return $str;
}   

Применение:

$string = "café"; 
echo $string;
echo transliterateString($string);

Выше будет выводиться ниже:

café
cafe
24.10.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..