MySQL / MariaDB不接受JSON格式?无法创建数据库

时间:2018-11-21 10:57:11

标签: php mysql mariadb

我目前在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”(实体类)或我在其中进行路由的控制器文件中的其他代码,请告诉我。

我非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

根据您的评论,Doctrine似乎认为它可以使用在您的mariadb版本上不可用的功能。

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

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

doctrine:
    dbal:
        server_version: '10.1'

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

就像我在评论中提到的那样,我个人将数据库标准化,并使用另一个表将比萨饼与配料链接起来,从而使搜索和过滤更加容易。

答案 1 :(得分:1)

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

一种解决方法是将 doctrine.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

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

答案 2 :(得分:0)

有同样的问题,我发现此解决方法:

Doctrine.yaml中发现server_version高于我的MariaDB版本,因此我在这一行中进行了更正:

   doctrine:
        dbal:
            server_version: '5.5'

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

然后再次运行:

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

那完成了工作,希望对您有所帮助。