【问题标题】:Is it possible to change mysql DB encoding charset from within a laravel migration?是否可以从 laravel 迁移中更改 mysql DB 编码字符集?
【发布时间】:2020-06-11 12:29:25
【问题描述】:

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

是否可以通过迁移来做到这一点?还是我必须编写一个单独的脚本?

迁移(为了完整性)

/**
 * 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');
}

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

【问题讨论】:

    标签: php mysql eloquent laravel-5


    【解决方案1】:

    这里有大死灵。

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

    The documentation 告诉你怎么做here

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

    编辑

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

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

    【讨论】:

    • 心!把这个老歌掸掉的方法!
    【解决方案2】:

    无法使用迁移类中通常使用的 Schema/Blueprint 类。但是您仍然可以使用 DB 外观运行所需的任何 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');
        }
    }
    

    只需将 databaseold_charsetold_collat​​ionnew_charsetnew_collat​​ion 替换为所需的值并确保您的用户有权运行此类查询。

    【讨论】:

    • 感谢您的帮助 :) 看到这个是否正常:[Illuminate\Database\QueryException] SQLSTATE[HY000]:一般错误:2014 无法执行查询,而其他无缓冲查询处于活动状态。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。 (SQL: ALTER DATABASE homestead CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci) ?
    • 在您执行迁移时是否有其他进程正在使用数据库?
    • 这就是我最初的想法,但检查后,没有:(
    • 这可能与 PDO 之前运行的查询有关。尝试在运行 DB::statement() 之前执行 DB::reconnect()
    • 为此干杯。我决定为它编写一个 bash 脚本。像我一样运行这个,真的打破了一切。我不喜欢这样 :D 不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2012-01-22
    • 2014-08-16
    • 1970-01-01
    • 2017-01-18
    • 2013-05-22
    • 2017-03-17
    相关资源
    最近更新 更多