是否可以在laravel迁移中更改mysql DB编码字符集?

时间:2015-07-21 13:43:12

标签: php mysql eloquent laravel-5

我尝试更改Laravel-5中mysql数据库的编码,我尝试过迁移,遵循此示例:https://slashdot.io/blog/adding-emoji-support-to-your-blog-948181198 - 但是,没有任何更新和charset /编码保持原样。

是否可以通过迁移执行此操作?或者我是否必须编写单独的脚本?

迁移(完整性)

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    DB::raw('ALTER TABLE homestead.survey_responses CONVERT TO CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci');
    DB::raw('REPAIR TABLE homestead.survey_responses');
    DB::raw('OPTIMIZE TABLE homestead.survey_responses');
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    DB::raw('ALTER TABLE homestead.survey_responses CONVERT TO CHARACTER SET = utf8 COLLATE utf8_unicode_ci');
    DB::raw('REPAIR TABLE homestead.survey_responses');
    DB::raw('OPTIMIZE TABLE homestead.survey_responses');
}

上述迁移运行没有错误,但遗憾的是什么也没做。

2 个答案:

答案 0 :(得分:8)

这里大死灵。

Laravel 7开箱即用,具有更改表上的字符集和排序规则的功能。我需要这个用于收银员/条带。

The documentation向您展示如何进行here

Schema::create('users', function (Blueprint $table) {
    ....
    $table->charset = 'utf8mb4';
    $table->collation = 'utf8mb4_bin';
});

修改

或者,对我来说,更好的解决方案是更改单个列的排序规则。

$table->string('name')->collation('utf8mb4_bin');

答案 1 :(得分:5)

使用通常在迁移类中使用的 Schema / Blueprint 类是不可能的。但是你仍然可以使用 DB facade运行你需要的任何SQL - 在你的情况下:     

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

class ChangeCharsetAndCollation Migration
{
    public function up()
    {
        DB::statement('ALTER DATABASE database CHARACTER SET new_charset COLLATE new_collation');
    }

    public function down()
    {
        DB::statement('ALTER DATABASE database CHARACTER SET old_charset COLLATE old_collation');
    }
}

只需将数据库 old_charset old_collat​​ion new_charset new_collat​​ion 替换为所需的值,并确保您的用户有权运行此类查询。