Запрос с умляутами в предложении where ничего не возвращает

Я хочу отфильтровать таблицу с немецкими умляутами в условии where в моем приложении Symfony, но, как ни странно, это не работает.

код:

$queryBuilder = $this->entityManager
    ->createQueryBuilder()
    ->select('p')
    ->from('AppBundle:Tablename', 'p');
$queryBuilder->andWhere('p.firm like :searchTerm');
$parameters['searchTerm'] = '%'.$data['search'].'%';
$dql = $this->entityManager
    ->createQuery($queryBuilder->getDql())
    ->setParameters($parameters);

данные:

MySQL [mydb_de]> SELECT firm FROM tablename WHERE firm LIKE '%bar%';
+---------+
| firm    |
+---------+
| föo&bar |
+---------+
1 rows in set (0.01 sec)

MySQL [mydb_de]> SELECT firm FROM tablename WHERE firm LIKE '%föo%';
+---------+
| firm    |
+---------+
| föo&bar |
+---------+
1 row in set (0.01 sec)

Я получаю ожидаемые результаты при поиске bar, но при поиске föo результатов нет.

дополнительная информация из db:

MySQL [mydb_de]> SHOW CREATE TABLE tablename;
+------------------+---------------------------------------+
| Table            | Create Table                          |
+------------------+---------------------------------------+
| tablename | CREATE TABLE `tablename` (
  `firm` varchar(100) DEFAULT NULL,
  ...
) ENGINE=MyISAM AUTO_INCREMENT=1902 DEFAULT CHARSET=latin1 |
+------------------+---------------------------------------+
1 row in set (0.00 sec)

MySQL [mydb_de]> SHOW TABLE STATUS where name like 'tablename';
+-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
| Name      | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time          | Collation         | Checksum | Create_options | Comment |
+-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
| tablename | MyISAM |      10 | Dynamic    | 1835 |             94 |      172556 | 281474976710655 |        33792 |         0 |           1902 | 2018-04-16 11:34:57 | 2018-04-16 11:34:57 | 2018-04-16 11:34:57 | latin1_swedish_ci |     NULL |                |         |
+-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------+
1 row in set (0.00 sec)

MySQL [mydb_de]> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Я безуспешно пытался переключить кодировку в моем config.yml (doctrine.dbal.charset) на latin1 и на latin1_swedish_ci.

Я включил ведение журнала (doctrine.dbal.logging), нашел запрос в профилировщике и проверил searchTerm, похоже, неплохо выглядит:

Запрос с умляутами в предложении where ничего не возвращает

У нас есть базы данных для многих стран, некоторые из них используют utf8, а другие нет. Насколько мне известно, наша german-db не использует utf8, и это невозможно изменить в ближайшем будущем.

Версия Symfony: 3.4.6
Версия доктрины: 2.5.14
Версия MySQL: 5.5.47

Кто-нибудь знает, что может быть причиной этого?

«Насколько мне известно, наш german-db не использует utf8, и это невозможно изменить в ближайшем будущем» Немецкие умляуты потребуют кодировки таблиц по крайней мере utf8, а не latin1

Raymond Nijland 16.04.2018 16:24

почему вы хотите установить latin1_swedish_ci вместо latin1_german_ci?

Krish 16.04.2018 17:27

Возможно, будет полезно - bugs.mysql.com/bug.php?id=37739

Eugene Ruban 17.04.2018 02:18
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
181
1

Ответы 1

Конфигурация Symfony для Doctrine по умолчанию следующая:

doctrine:
    dbal:
        # configure these for your database server
        driver: 'pdo_mysql'
        server_version: '5.7'
        charset: utf8mb4
        url: '(your database url)'

Эта конфигурация указывает, что таблицы базы данных должны использовать межклассовый utf8mb4. Именно для работы со специальными символами (а также сложными символами utf-8 (например, смайликами), если вы не используете mariadb).

Другие вопросы по теме