在Laravel迁移中更改数据库列的排序规则无效。

4

我想要更改 "users" 表中 "about_me" 列的排序规则。为此,我使用了以下代码。我只是将排序规则更改为 utf8mb4_unicode_ci,但是代码没有起作用。

 public function up()
    {
        if (Schema::hasColumn("users", "about_me")) {
            Schema::table("users", function(Blueprint $table) {
                $table->collation = 'utf8mb4_unicode_ci';
                $table->charset = 'utf8mb4';
            });
        }
 }

我已经在 /config/database.php 中进行了更改,这帮助我将数据保存在数据库中,但在提取数据库后,我发现特殊符号未显示出来。当我将该列的排序规则更改为 utf8mb4_unicode_ci 时,它正常工作。但我想在迁移中设置。当前的代码不起作用,我需要正确的代码以使其正常工作。

Laravel支持在MySQL上按列修改排序规则。您需要在此处编写原始查询以进行整个表的修改。 - Oluwafemi Sule
2个回答

15

Laravel 支持在 MySQL 数据库中对每个列进行排序规则的修改。如果要对整个表进行修改,则需要编写原始查询。

public function up()
{

    DB::statement("ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
}

报错:无法访问受保护的属性$table。但是,使用{$table->table} => users可以正常工作。此外,Schema::table在这里是无用的,您可以直接编写DB::statement(...)。 - Manic Depression
感谢 @ManicDepression 的评论。答案已更新。 - Oluwafemi Sule

1
在现代 Laravel 中,可以在表或列上设置字符集和排序规则。

https://laravel.com/docs/8.x/migrations#database-connection-table-options

    // You can change table.
    Schema::table('users`', function (Blueprint $table) {
        $table->charset = 'utf8mb4';
        $table->collation = 'utf8mb4_unicode_ci';
    });

    // You can change on a field of a table.
    Schema::table('users', function (Blueprint $table) {
        $table->string('about_me')->charset('utf8mb4')->collation('utf8mb4_unicode_ci')->change();
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接