航海者数据库和 MariaDB 服务器

voyager databases and MariaDB server

10.1.28-MariaDB

我正在尝试在 Voyager 管理面板中创建一个新的 table,但我一直收到错误消息:

generic.exception: An exception occurred while executing 'CREATE TABLE newReport (id INT UNSIGNED AUTO_INCREMENT NOT NULL, owner_id INT DEFAULT NULL, title VARCHAR(166) DEFAULT NULL, description text DEFAULT NULL, report json DEFAULT NULL, created_at timestamp null DEFAULT NULL, updated_at timestamp null DEFAULT NULL, deleted_at timestamp null DEFAULT NULL, INDEX newreport_owner_id_index (owner_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_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 DEFAULT NULL, created_at timestamp null DEFAULT NULL, updated_at timestamp ' at line 1

SQL 语法错误 的某些变体,具体取决于我正在尝试的内容。

我正在使用 Xampp 并且还没有安装 MariaDB 服务器 我需要使用 MariaDB 服务器?还是我的问题是别的?

screenshot of the table

如果我删除 json 数据类型,错误将变为:

generic.exception: An exception occurred while executing 'CREATE TABLE newReport (id INT UNSIGNED AUTO_INCREMENT NOT NULL, owner_id INT DEFAULT NULL, title VARCHAR(166) NOT NULL, description text NOT NULL, report text NOT NULL, created_at timestamp DEFAULT 'CURRENT_DATE', updated_at timestamp null DEFAULT NULL, deleted_at timestamp null DEFAULT NULL, INDEX newreport_owner_id_index (owner_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB': SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at'

JSON 数据类型是在 MySQL 5.7 中引入的。

此数据类型在 MySQL 的早期版本(5.6 或更早版本)中不可用,并且尚未在 MariaDB 中实现(至少在 10.2 版本之前,但 MariaDB 添加了一些 JSON 功能,例如 JSON_VALID.)

编辑

MariaDB 在版本 10.2.7

中添加了对 JSON 数据类型的支持

https://mariadb.com/kb/en/library/json-data-type/


检查您所连接的 MySQL/MariaDB 服务器的版本:

 SHOW VARIABLES LIKE 'version'

作为测试,您可以将 JSON 数据类型替换为您知道受支持的另一种数据类型,例如。 VARCHAR(20)TEXT.

如果您的 MySQL/MariaDB 服务器不支持 json 数据类型,您可以使用其他文本类型。


在我看来,错误是在 'json 处标记 SQL 语法中的问题。这就是我们希望找到有效数据类型的地方。作为测试,我的建议是将其替换为已知的良好数据类型,目的是确定这是否是问题所在。

从错误消息来看,服务器似乎是 MariaDB(不是 MySQL)


我们看到正在执行的语句:

CREATE TABLE newReport 
( id          INT UNSIGNED AUTO_INCREMENT NOT NULL
, owner_id    INT DEFAULT NULL
, title       VARCHAR(166) DEFAULT NULL
, description text DEFAULT NULL
, report      json DEFAULT NULL
, created_at  timestamp null DEFAULT NULL
, updated_at  timestamp null DEFAULT NULL
, deleted_at  timestamp null DEFAULT NULL
, INDEX newreport_owner_id_index (owner_id)
, PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_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 DEFAULT NULL ...

编辑

text 替换 json 将错误更改为

1067 Invalid default value for 'created_at'

看起来很奇怪,因为在 json 处语法错误的语句中的内容是

  created_at  timestamp null DEFAULT NULL
                                     ^^^^

本来可以的,但由于某些原因现在改为

  created_at timestamp null DEFAULT 'CURRENT_DATE' 
                                    ^^^^^^^^^^^^^^

该字符串值 'CURRENT_DATE' 不是有效的时间戳值。看起来我们打算引用关键字 CURRENT_TIMESTAMP,而不是字符串文字

  created_at timestamp null DEFAULT CURRENT_TIMESTAMP
                                    ^^^^^^^^^^^^^^^^^