使用 laravel 更新列排序规则

Posted

技术标签:

【中文标题】使用 laravel 更新列排序规则【英文标题】:update column collation with laravel 【发布时间】:2019-11-08 06:12:09 【问题描述】:

我的表中有一个case-insensitive 排序规则列。

col_name : hash_id, collation : utf8mb4_unicode_ci

当我只搜索前者时,我得到了yA2JeGsYA2JeGs 的结果。

所以我需要更新排序规则以确保该列的case-sensitivity

我尝试更改该列的排序规则,创建一个新的migration 文件:

public function up()

    Schema::table('product_match_unmatches', function (Blueprint $table) 
        $table->string('hash_id')->collate('utf8mb4_bin')->change();
    );

还有$table->string('hash_id')->collation('utf8mb4_bin')->change();

迁移成功运行,但排序规则保持不变。

我如何在 laravel 中做到这一点?

【问题讨论】:

【参考方案1】:

您需要使用 laravel 架构构建器创建新的迁移并使列区分大小写,代码如下:

$table->string('columName')->collation('utf8_bin')->change();

https://laravel.com/docs/7.x/migrations

【讨论】:

文档似乎提到将排序规则更改为 collation('utf8mb4_bin') 而不是 collate utf8_cs -- 不在 mysql 中。【参考方案2】:

您可以在查询时转换排序规则

Model::where(\DB::raw('hash_id COLLATE utf8mb4_bin'), 'yA2JeGs');

但是,您可能应该更改表本身的排序规则,因为不区分大小写的排序规则似乎是在该字段开始时使用的错误排序规则。

注意:MySQL 没有 utf8mb4_general_cs 排序规则。但是,如果您只使用 ASCII 哈希码,那么 utf8mb4_bin 应该就足够了。

【讨论】:

我尝试更改表格列的排序规则,但结果相同。更新了我的帖子。请检查【参考方案3】:

我只能使用原始查询更改排序规则,蓝图 change() 方法对我没有任何帮助,除非我也更改了字段类型。

这对我有用:

public function up()

    DB::statement("ALTER TABLE tableName MODIFY columnName VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");

【讨论】:

以上是关于使用 laravel 更新列排序规则的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 2005 中更改聚集索引列的排序规则

数据库、表、列排序规则的区别

如何使用 SQL 设置列的排序规则?

更改列排序规则

SQL Server 中索引的排序规则

更改列排序规则 - 安全吗?