mysql/mariadb不接受json格式?无法创建数据库

wko9yo5t  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(756)

我目前正在phpmyadmin上使用xampp/apache和mariadb。我正在尝试基于我的代码创建一个表,使用条令和注解来验证表单。我只想将表单中输入的值存储在数据库中。在另一个例子中,这种方法非常有效。
但是现在我有一个“checkbox字段”,我猜它在创建数据库时会引起一些麻烦。
我在控制台中使用这些命令:

  1. php bin/console make:migration

之后:

  1. php bin/console doctrine:migrations:migrate

调用第二个=在数据库中创建表时,出现以下错误:

  1. Migration 20181121103017 failed during Execution.
  2. Error An exception occurred while executing 'CREATE TABLE pizza (id INT
  3. AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL
  4. phone VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL,
  5. size INT NOT NULL, ingredient JSON NOT NULL COMMENT '(DC2Type:json_array)', delivery INT NOT NULL,
  6. PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':
  7. SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
  8. your SQL syntax; check the manual that
  9. corresponds to your MariaDB server version for the right syntax to use near
  10. 'JSON NOT NULL COMMENT '(DC2Type:json_
  11. array)', delivery INT NOT NULL, PRIMARY KEY' at line 1

我真的不知道在这一点上我做错了什么。
这些是我在“pizza.php”文件中的注解。

  1. // ------------------
  2. /**
  3. * @Assert\NotBlank(
  4. * message = "E-Mail Address required"
  5. * )
  6. * @Assert\Email(
  7. * message = "The email '{{ value }}' is not a valid email."
  8. * )
  9. * @Assert\Length(min="2", max="255")
  10. * @ORM\Column(type="string", length=255)
  11. */
  12. protected $email;
  13. // ------------------
  14. /**
  15. * @Assert\Range(min=0, max=3)
  16. * @ORM\Column(type="integer")
  17. */
  18. protected $size;
  19. // ------------------
  20. /**
  21. *@Assert\NotBlank(
  22. * message = "Choose at least 1 ingredient!"
  23. * )
  24. * @ORM\Column(type="array")
  25. */
  26. protected $ingredient;
  27. // ------------------
  28. /**
  29. * @Assert\NotBlank(
  30. * message = "Choose a delivery option!"
  31. * )
  32. * @Assert\Range(min=0, max=1)
  33. * @ORM\Column(type="integer")
  34. */
  35. protected $delivery;

表单本身运行得非常好,验证确实按照我的预期工作。
我到底做错了什么?
如果你还需要我的“pizza.php”(实体类)或我的控制器文件中的代码,请告诉我。
我很感激你的帮助!

wn9m85ua

wn9m85ua1#

根据您的评论,似乎条令认为它可以使用在您的mariadb版本中不可用的功能。
如果您告诉Doritory您使用的是哪个版本,它将为该列选择正确的数据类型,在本例中可能是这样 LONGTEXT 或者类似的东西。
根据您使用的是什么,它看起来像(例如使用symfony中的yaml文件):

  1. doctrine:
  2. dbal:
  3. server_version: '10.1'

请注意,您需要重新生成迁移。
正如我在评论中提到的,我个人会规范化数据库,并使用不同的表格将比萨饼与配料联系起来,以便于搜索和过滤。

mmvthczy

mmvthczy2#

有同样的问题,我找到了解决方法:
Doctrine.yaml 发现服务器的\u版本比我的mariadb版本高,所以我在这行中更正了这一点:

  1. doctrine:
  2. dbal:
  3. server_version: '5.5'

在手动删除已完成的迁移之前,我没有工作。你可以在里面找到它们 src/Migrations .
然后再次运行:

  1. php bin/console make:migration
  2. php bin/console doctrine:migrations:migrate

这就成功了,希望能有所帮助。

d4so4syb

d4so4syb3#

首先检查你的版本。版本10.1不支持json数据类型,对版本10.2的支持不完整。
一个解决方法是将document.yaml文件中的版本 server_version: '5.6' 然后用 php bin/console make:entity --regenerate 然后使用 php bin/console make:migration 这将生成一个数据类型设置为longtext的迁移文件。
然后,在src/migrations中打开其中的每个文件,检查是否有任何以json作为数据类型的迁移文件,并删除所有具有此类数据类型的迁移。请记住,如果不删除这些文件,则下一个命令将对每个文件进行迭代,从旧文件开始逐个将它们持久化到数据库。如果存在这样的文件,它将再次触发错误。
最后,快跑 php bin/console doctrine:migrations:migrate 它将相应地保留所有到数据库的迁移。

相关问题