Laravel 5.5+MariaDB:创建binary(16)列的无插件最简方案咨询
解决Laravel 5.5创建binary(16)列的问题
你遇到的这个情况特别常见——Laravel 5.5的Schema Builder里binary()方法默认生成的是BLOB类型,但我们需要的是固定长度的binary(16)来存储MD5哈希(毕竟MD5转成二进制后刚好是16字节)。这里给你一个完全原生、无需外部插件、也不用担心后续Laravel更新失效的最简实现方式:
直接在迁移文件里使用原生SQL语句来创建这个列,具体代码如下:
public function up() { Schema::create('your_table_name', function (Blueprint $table) { // 先定义其他常规列 $table->increments('id'); // ... 这里放你需要的其他列,比如url字段等 // 用原生SQL精准创建binary(16)类型的url_hash列 DB::statement('ALTER TABLE your_table_name ADD COLUMN url_hash BINARY(16) AFTER id'); }); // 如果是给已存在的表添加列,直接用下面的语句即可 // DB::statement('ALTER TABLE your_table_name ADD COLUMN url_hash BINARY(16)'); } public function down() { Schema::table('your_table_name', function (Blueprint $table) { $table->dropColumn('url_hash'); }); }
为什么这个方法靠谱?
- 完全依赖Laravel自带的
DB::statement()方法,没有任何第三方依赖,不会因为插件停更或Laravel版本迭代失效; - 直接使用MySQL/MariaDB原生语法,精准控制列类型为
binary(16),完美匹配MD5哈希的存储需求; - 不管是新建表还是给已有表追加列都适用,灵活度拉满。
另外补充个小细节:存入数据时记得把MD5哈希转换成二进制格式,用PHP的hex2bin()函数就行:
$model->url_hash = hex2bin(md5($yourUrl)); $model->save();
查询的时候如果需要对比,也可以用bin2hex()把二进制转回十六进制字符串:
$targetHash = hex2bin(md5($targetUrl)); $record = YourModel::where('url_hash', $targetHash)->first();
内容的提问来源于stack exchange,提问作者Paolo_Mulder
相关产品推荐
相关产品推荐

