Я хочу отфильтровать таблицу с немецкими умляутами в условии 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, похоже, неплохо выглядит:
У нас есть базы данных для многих стран, некоторые из них используют utf8, а другие нет. Насколько мне известно, наша german-db не использует utf8, и это невозможно изменить в ближайшем будущем.
Версия Symfony: 3.4.6
Версия доктрины: 2.5.14
Версия MySQL: 5.5.47
Кто-нибудь знает, что может быть причиной этого?
почему вы хотите установить latin1_swedish_ci вместо latin1_german_ci?
Возможно, будет полезно - bugs.mysql.com/bug.php?id=37739






Конфигурация 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).
«Насколько мне известно, наш german-db не использует utf8, и это невозможно изменить в ближайшем будущем» Немецкие умляуты потребуют кодировки таблиц по крайней мере utf8, а не latin1