【问题标题】:MySQL / MariaDB not accepting JSON Format? Can not create DatabaseMySQL / MariaDB 不接受 JSON 格式?无法创建数据库
【发布时间】:2019-04-23 22:28:34
【问题描述】:

我目前在 phpmyadmin 上使用 XAMPP/Apache 和 MariaDB。 我正在尝试使用 Doctrine 基于我的代码创建一个表,因此使用注释来验证表单。我只是想将表单中输入的值存储在数据库中。 在另一个示例中,这非常有效。

但是现在我有一个“复选框字段”,我猜它在创建数据库时会造成某种麻烦。

我在控制台中使用这些命令:

php bin/console make:migration

之后:

php bin/console doctrine:migrations:migrate

当调用第二个 = 当我尝试在我的数据库中创建表时,我收到以下错误:

Migration 20181121103017 failed during Execution. 
Error An exception occurred while executing 'CREATE TABLE pizza (id INT 
AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL
phone VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, 
size INT NOT NULL, ingredient JSON NOT NULL COMMENT '(DC2Type:json_array)', delivery INT NOT NULL, 
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':


SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in 
your SQL syntax; check the manual that
corresponds to your MariaDB server version for the right syntax to use near 
'JSON NOT NULL COMMENT '(DC2Type:json_
array)', delivery INT NOT NULL, PRIMARY KEY' at line 1

此时我真的不知道自己做错了什么。

这些是我在“Pizza.php”文件中的注释。

// ------------------

/**
 * @Assert\NotBlank(
 *     message = "E-Mail Address required"
 * )
 * @Assert\Email(
 *     message = "The email '{{ value }}' is not a valid email."
 * )
 * @Assert\Length(min="2", max="255")
 * @ORM\Column(type="string", length=255)
 */

protected $email;

// ------------------

/**
 * @Assert\Range(min=0, max=3)
 * @ORM\Column(type="integer")
 */

protected $size;

// ------------------

/**
 *@Assert\NotBlank(
 *     message = "Choose at least 1 ingredient!"
 * )
 * @ORM\Column(type="array")
 */

protected $ingredient;

// ------------------

/**
 * @Assert\NotBlank(
 *     message = "Choose a delivery option!"
 * )
 * @Assert\Range(min=0, max=1)
 * @ORM\Column(type="integer")
 */

protected $delivery;

表单本身运行良好,验证按我的预期工作。

我到底做错了什么?

如果您需要我的“Pizza.php”(实体类)或我的控制器文件中的更多代码,请告诉我。

感谢您的帮助!

【问题讨论】:

  • 这看起来像是您正在运行的 mysql / mariadb 版本与您正在运行的学说不匹配。话虽如此,我个人会规范化数据库。
  • 您的 MariaDB 版本是否低于 10.2.7?见mariadb.com/kb/en/library/json-data-type
  • 是的,我目前正在运行:服务器版本:10.1.19-MariaDB - mariadb.org 二进制分发
  • 我可以简单地更新它我们会导致问题吗?现在有解决这个问题的方法吗?

标签: php mysql mariadb


【解决方案1】:

根据您的 cmets,Doctrine 似乎认为它可以使用您的 mariadb 版本中不可用的功能。

如果您告诉教义您正在使用哪个版本,它将为该列选择正确的数据类型,在这种情况下可能是 LONGTEXT 或类似的东西。

根据您使用的内容,它看起来像(例如在 symfony 中使用 yaml 文件):

doctrine:
    dbal:
        server_version: '10.1'

请注意,您需要重新生成迁移。

就像我在评论中提到的那样,我个人会规范化数据库并使用不同的表将比萨饼与配料相关联,以便更轻松地搜索和过滤。

【讨论】:

  • 我将它添加到我的 yml 文件中,但它并没有改变我的错误。不幸的是,无论哪种输入方式都无法识别“LONGTYPE”类型。我正在使用我在大学课程中被告知的数据库格式
  • @Calimera 您是否已删除已生成的迁移并使用修改后的设置重新生成它们?
  • 您能告诉我如何删除迁移吗?我刚刚再次调用 make:migration!但我想它不是这样删除的
  • @Calimera 不,我不知道您到底在使用什么,但可能有一个 migrations 目录存储所有单独的迁移。您需要删除尚未执行的那些以便再次构建它们。
  • 我创建了一个全新的数据库,因此无法存储任何内容。我仍然遇到同样的错误。
【解决方案2】:

首先检查您的 mariadb 版本。 10.1 版不支持 JSON 数据类型,并且对 10.2 版的支持不完整。

解决方法是将 doctrine.yaml 文件中的版本改为

server_version: '5.6'

然后用

重新生成getter和setter

php bin/console make:entity --regenerate

然后用

生成迁移文件

php bin/console make:migration

这将生成一个数据类型设置为 LONGTEXT 的迁移文件。

之后,在 src/Migrations 中打开其中的每个文件并检查是否有任何以 JSON 作为数据类型的迁移文件并删除所有迁移具有这样的数据类型。请记住,如果您不删除这些文件,则下一个命令将迭代每个文件,将它们从旧文件开始一个一个地保存到数据库中。如果存在这样的文件,它将再次触发错误。

最后,运行

php bin/console doctrine:migrations:migrate

这会将所有迁移相应地持久化到数据库。

【讨论】:

  • 也有这个问题,这对我很有用!谢谢!
【解决方案3】:

遇到了同样的问题,我找到了这个解决方法:

Doctrine.yaml 发现 server_version 比我的 MariaDB 版本高,所以我在这行更正了:

   doctrine:
        dbal:
            server_version: '5.5'

直到我手动删除我已经完成的迁移,我才开始工作。你可以在src/Migrations找到它们。

然后再次运行:

 php bin/console make:migration
 php bin/console doctrine:migrations:migrate

这样就成功了,希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2020-04-21
    • 2013-10-17
    相关资源
    最近更新 更多