【问题标题】:mariaDB JSON support in LaravelLaravel 中的 mariaDB JSON 支持
【发布时间】:2017-07-14 12:28:30
【问题描述】:

我正在尝试在 XAMP 中创建一个 json 数据库,在使用 phpmyAdmin 时它显示我正在使用 mariaDB,但在我的 xamp-control panel v3.2.2 中它显示正在运行 mySQL on port 3306。我正在使用 Laravel 5.4 框架来创建数据库,以下是我正在尝试执行的迁移:

Schema::connection('newPortal')->create('pages', function (Blueprint $table){
    $table->increments('id');
    $table->string('title');
    $table->string('slug')->unique()->index();
    $table->json('styles')->nullable();
    $table->json('content')->nullable();
    $table->json('scripts')->nullable();
    $table->softDeletes();
    $table->timestamps();
});

现在执行此操作时出现以下错误:

SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'json null、content json null、scripts json null、deleted_at timestamp null' 附近使用正确的语法(SQL:创建表 pages (id int unsigned not null auto_increment 主键, title varchar(191) not null, slug varchar(191) not null, styles json null, content json null, scripts json null, deleted_at timestamp null, created_at timestamp null, updated_at timestamp null) 默认字符集 utf8mb4 collat​​e utf8mb4_unicode_ci)

即使我保持不为空,它也会抛出相同的错误。我想要 json 格式的数据,我检查了支持的版本,并根据文档 json 格式支持从版本 MariaDB 10.0.16. 开始,我正在使用 10.1.21-MariaDB

帮我解决这个问题。

【问题讨论】:

标签: php json laravel mariadb laravel-5.4


【解决方案1】:

MariaDB 10.2.7 版开始; JSON 数据类型是 LONGTEXT 的别名。

如果您对 MariaDB 中的 JSON 数据类型有疑问,只需将其更改为 LONGTEXT。 ;-)

或者使用 this package 将 MariaDB JSON 添加到 Laravel

【讨论】:

  • 我正在使用 laravel 5.7,但我无法(我不知道如何)配置 mariadb 驱动程序以用于数据库连接。我得到:数据库 [mariadb] 未配置。有谁知道我该如何设置它?
【解决方案2】:

请注意,1064 抱怨数据类型“json”。 MariaDB 中还没有实现。

您可以接近Dynamic Columns,它至少可以将它们提取到 JSON 语法中。

另一件事(可能是您所指的)是CONNECT 能够拥有 JSON 表类型。 (不是类型。)

MySQL 5.7 有一个名为 JSON 的数据类型,以及一组用于操作此类的函数。

【讨论】:

  • 正如@ybr-nx 指出的那样,MariaDB 10.2.7(2017 年 7 月 12 日)添加了“JSON”作为数据类型别名,以促进从 MySQL 到 MariaDB 的复制。
  • 如何知道错误号 1064 的含义?你能告诉我你在哪里抬头吗?
  • @Tony - 1064 表示“语法错误”。这是一个常见的问题。 “近...”部分几乎总是准确地说明问题出在哪里——要么是消息中的第一个标记,要么是它之前的最后一个标记。在这个例子中,它正指向“json”。快速检查版本的语法表明“json”是未知的。 (但后来的版本实现了。)
【解决方案3】:

想出了一个简单的解决方法(不推荐用于生产)-

根据 mariadb 10.1.32 及更低版本,mariadb 似乎不支持 json 数据类型,我仍然不确定它是否在 10.2.7+ 版本中可用。

但这里有一个简单的解决方法来解决这个问题。

将 json 数据类型更改为文本,然后再次运行迁移。

(https://user-images.githubusercontent.com/27993070/41234555-19c5d1d8-6dbf-11e8-9a4b-0644b03aecfc.png)

来源- https://github.com/laravel/framework/issues/13622

【讨论】:

    【解决方案4】:

    通过使用 composer 运行此命令,将 MariaDB JSON 支持添加到 Laravel:

    composer require ybr-nx/laravel-mariadb
    

    如果您使用的是 Larvel 5.3 和 5.4,请执行以下两项操作:

    • config/app.php 中添加MariaDBServiceProvider 供应商行:
    'providers' => [
        // other exist providers
        YbrNX\MariaDB\MariaDBServiceProvider::class,
    ]
    
    • 在数据库配置中将默认连接设置为 mariadb:
    'defaultconnection' => [
        'driver' => 'mariadb',
    

    添加包完成,然后您可以使用功能。

    在迁移中:

    $table->json('field') //CHECK (JSON_VALID(field))
    $table->json('field')->nullable() //CHECK (field IS NULL OR JSON_VALID(field))
    

    对于查询构建器:

    $query->where('somejson->something->somethingelse', 2)
    DB::table('sometable')->select('sometable.somedata', 'sometable.somejson->somedata as somejsondata')
    

    此外,JSON_SET() 在 MariaDB 中的工作方式与在 MySQL 5.7 中一样:

    DB::table('sometable')->where('somejson->somedata', $id)->update(['somejson->otherdata' => 'newvalue']);
    

    注意 1:MariaDB 自 10.2.7 版起就有 JSON 数据类型的别名

    注意 2:MariaDB

    retrieved from

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 2023-03-21
      • 2021-04-07
      • 2017-12-25
      • 2019-11-13
      • 1970-01-01
      • 2016-06-09
      • 2013-12-05
      • 2019-06-24
      相关资源
      最近更新 更多