【问题标题】:Change String to Decimal Laravel Migration将字符串更改为十进制 Laravel 迁移
【发布时间】:2020-06-01 18:38:10
【问题描述】:

我正在尝试更改我当前的表,并且可以使用我的迁移文件中的 SQL 查询来做到这一点,如下所示:

<?php
    public function up()
    {
        Schema::table('xyz', function (Blueprint $table) {
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_needed funding_needed decimal(10, 2) NOT NULL DEFAULT 0.00 ');
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_received funding_received decimal(10, 2) NOT NULL DEFAULT 0.00 ');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('xyz', function (Blueprint $table) {
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_needed funding_needed varchar(191) NOT NULL ');
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_received funding_received varchar(191) NOT NULL DEFAULT 0');
        });
    }

但是如果我这样做,我会得到一个错误:

<?php
    public function up()
    {
        Schema::table('xyz', function (Blueprint $table) {
             $table->decimal('funding_needed', 10, 2)->nullable(false)->default(0.00)->change();
             $table->decimal('funding_received', 10, 2)->nullable(false)->default(0.00)->change();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('xyz', function (Blueprint $table) {          
         $table->string('funding_needed', 191)->nullable(false)->default(false)->change();
         $table->string('funding_received', 191)->nullable(false)->default(0)->change();
        });
    }

错误:

语法错误或访问冲突:1064 您的 SQL 中有错误 句法;检查与您的 MySQL 服务器版本相对应的手册 在'CHARACTER SET utf8mb4 DEFAULT'0'附近使用正确的语法 NOT NULL COLLATE utf8mb4_unicode_ci, CHANGE ' 在第 1 行 (SQL: ALTER 表 xyz 更改funding_neededfunding_needed NUMERIC(10, 2) CHARACTER SET utf8mb4 DEFAULT '0' NOT NULL COLLATE utf8mb4_unicode_ci,更改资金_已收到资金_已收到 NUMERIC(10, 2) 字符集 utf8mb4 默认 '0' NOT NULL 整理 utf8mb4_unicode_ci)

由于在生产环境中运行,我想以第二种方式进行。我不想修改生产迁移以匹配我的生产数据库。

【问题讨论】:

  • 不知道您遇到的具体错误,但是,我认为一起使用 NOT NULL 和 DEFAULT 是多余的。如果它有一个默认值,那么显然不会为空,对吧?
  • 你是对的。我只是想匹配 SQL 查询。如果我删除 nullable(false) 并只保留默认值,它仍然无法正常运行。
  • 您是否尝试过将参数作为字符串传递? 0.00 可能不是 php 中的有效数字,“0.00”
  • 作为一个字符串工作,但不能作为一个小数。我正在尝试将其从字符串更改为小数
  • 我的意思是,$table-&gt;decimal('funding_needed', 10, 2)-&gt;nullable(false)-&gt;default("0.00")-&gt;change();

标签: php mysql sql laravel migration


【解决方案1】:

正如 Github thread 中所指出的,对于教义/dbal 包,这是您在运行此更新迁移之前安装的包,在更改列类型时存在错误。

同时使用-&gt;charset(null)-&gt;change() 应该作为一种解决方法,正如链接中所指出的那样。

【讨论】:

  • 我尝试了几种方法,甚至尝试简单地将$table-&gt;string 更改为$table-&gt;decimal 仍然出错。完整的错误已在我原来的问题中更新。
  • 那么,即使你自己运行 change 方法,也会报错?如果只运行该部分会出现什么错误?
  • 如果我运行$table-&gt;decimal('funding_needed', 10, 2)-&gt;change();,我的问题中会出现上述错误。
  • 嘘!! -&gt;charset(null) 在更改之前成功了!感谢您对此提供帮助。更新您的答案,以便我将其标记为正确。
【解决方案2】:

伙计们,我在将string 转换为decimal 时遇到了麻烦,正如@echo 在 cmets 中所说的那样

-&gt;charset(null)-&gt;change(); 成功了!

谢谢你们节省了我的时间!

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2017-07-19
    相关资源
    最近更新 更多