【问题标题】:voyager databases and MariaDB server航海者数据库和 MariaDB 服务器
【发布时间】:2018-04-20 09:16:21
【问题描述】:

10.1.28-MariaDB

我正在尝试在 voyager 管理面板中创建一个新表,但我不断收到错误消息:

generic.exception: 执行'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]: 语法错误或访问冲突:1064您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'json DEFAULT NULL, created_at timestamp null DEFAULT NULL, updated_at timestamp' 附近使用正确的语法

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

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

screenshot of the table

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

generic.exception: 执行'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]: 语法错误或访问冲突: 1067 'created_at' 的默认值无效

【问题讨论】:

  • 可能重复。看看这是否有帮助。 stackoverflow.com/questions/42425667/…
  • 如果我删除 json 库仑,我仍然会得到同样的错误(减去“json DEFAULT NULL”部分)我认为我的问题与 json 数据类型无关
  • 您能发表您的Create Table 声明吗?很难看到。
  • 如问题中所述,我正在使用 voyager 管理面板(不是写语句),请查看“表格截图”

标签: mysql mariadb laravel-5.5 voyager


【解决方案1】:

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 ...

编辑

json 替换为text 会将错误更改为

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
                                    ^^^^^^^^^^^^^^^^^

【讨论】:

  • 字符串文字 DEFAULT 'CURRENT_DATE' 对 TIMESTAMP 数据类型无效。也许你的意思是DEFAULT CURRENT_TIMESTAMP。 (注意关键字周围没有单引号,单引号用于将字符串文字括起来)
  • "CURRENT_TIMESTAMP" 仍然出现错误,因此返回 null 并且现在可以正常工作,谢谢
猜你喜欢
  • 2021-04-06
  • 2021-08-07
  • 2021-09-21
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2021-08-07
  • 2020-03-26
  • 2019-05-03
相关资源
最近更新 更多