Я использую Symfony 4 с базой данных MySQL (5.5.57-0ubuntu0.14.04.1), которая не поддерживает тип JSON.
Когда я сопоставляю поле с «json» с помощью файла конфигурации Doctrine yml, файл миграции, сгенерированный doctrine:migrations:diff, использует тип JSON MySQL вместо LONGTEXT, и при попытке запустить миграцию возникает ошибка.
И каждый раз, когда выполняется перенос миграции, мне приходится вручную менять JSON на LONGTEXT для последних изменений и удалять изменения в JSON в результате более старых изменений.
Легко ошибиться, если в одной из этих миграций вы забудете удалить «ALTER TABLE CHANGE somefield JSON».
На данный момент мое решение - добавить в конфигурационный файл doctrine.yml следующее:
doctrine:
dbal:
mapping_types:
longtext: json
Это делает некоторые странные, но легко отслеживаемые и удаляемые, изменения, когда я запускаю doctrine:migrations:diff -v, например, изменение на LONGTEXT некоторых полей, которые уже были LONGTEXT. Я не знаю почему, и в конце концов я должен это исправить.
Но, по крайней мере, я мог бы помешать доктрине изменить мой длинный текст на тип данных MySQL json, который отображается как тип данных json доктрины.
Кто-нибудь сталкивался с этой проблемой?
Спасибо!
Я понимаю, зачем использовать json, если вы не можете проверить его, используя настоящий JSON в базе данных ??? и я думаю, ты прав. Но я бы хотел настроить эту функцию для разных серверов, например, в doctrine_prod.yml, если это возможно ... но да, вы правы. Doctrine решила не «лгать» разработчикам, если вы говорите, что доктрина json будет использовать json, поскольку он существует в MySQL, если он не поддерживается текущей версией, это ваша проблема. Спасибо за совет ;-)
Верно, я полагаю, что вам не следует использовать отображение json в Doctrine, если вы используете старую версию MySQL, которая не поддерживает этот тип данных.






Я был неправ, используя таким образом конфигурацию "mapping_types". В этом нет смысла. Решение Это еще проще, и я не осознавал, что существует следующий параметр:
server_version
Просто добавьте версию сервера в конфигурацию dbal следующим образом:
doctrine:
dbal:
driver: 'pdo_mysql'
server_version: '5.5.57'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
server_version. - В НЕТ должна быть указана версия MySql (например, 5.5.57), а в ДОЛЖЕН должна быть указана версия MariaDB (например, mariadb-10.2.27). В противном случае вы получите скрытые проблемы с DBAL (например, неправильно сгенерированные миграции), даже если все работает и ошибок нет.
Для меня у меня была та же проблема, и решение заключалось в том, чтобы войти в созданную миграцию (например, Version20190306110143.php) и изменить dataType «JSON» на «LONGTEXT» !!
На самом деле, у меня это сработало, но, честно говоря, я не знаю, не вызовет ли это проблем со временем. В любом случае, если это произойдет, я отправлю их
Благодарность
Я не являюсь пользователем Doctrine, но похоже, что вы должны сопоставить поле с «текстом», а не с «json». Это именно то, что вы делаете, если не можете использовать тип данных
JSON. Если вы храните JSON в LONGTEXT, MySQL не будет проверять, что вы храните правильно отформатированный JSON. Это просто текст, который по совпадению может быть JSON, но вы также можете сохранить любой другой текст в этом поле. Так что это просто текст. Объявите это как текст.