You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel/MySQL/PHP中替换数据库Unicode字符的最优方案

嘿,这个问题我之前也碰到过!Google Places返回的长破折号(Unicode U+2013)和我们日常用的短破折号(U+002D)根本不是同一个字符,所以用explode(' - ', $hours)自然拆分失败。下面给你几个在Laravel/MySQL/PHP环境里的解决办法,按最优程度排序:

1. 直接用MySQL批量替换(最快最省资源)

直接在数据库层面操作是最高效的,不用把数据拉到PHP层处理,节省内存和时间。你可以用MySQL的REPLACE函数批量替换:

首先建议先跑查询确认替换效果,避免误操作:

SELECT hours, REPLACE(hours, '–', '-') AS converted_hours 
FROM your_table_name 
WHERE hours LIKE '%–%';

确认没问题后,执行更新语句:

UPDATE your_table_name 
SET hours = REPLACE(hours, '–', '-');

如果输入长破折号有困难,也可以用Unicode转义写法(适配utf8mb4编码):

UPDATE your_table_name 
SET hours = REPLACE(hours, CHAR(8211 USING utf8mb4), '-');

注意:操作前记得备份数据库,或者先在测试环境验证!

2. Laravel Artisan命令(适合带业务逻辑的场景)

如果需要在替换前后加额外逻辑(比如记录修改日志、只更新特定条件的记录),可以写一个自定义Artisan命令:

首先生成命令文件:

php artisan make:command FixHoursDashes

然后在app/Console/Commands/FixHoursDashes.php里编写处理逻辑:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\YourBusinessModel; // 替换成你的实际模型类

class FixHoursDashes extends Command
{
    protected $signature = 'fix:hours-dashes';
    protected $description = '替换营业时间中的长破折号为普通短破折号';

    public function handle()
    {
        $updatedCount = 0;
        // 分批处理避免内存溢出,每次处理100条
        YourBusinessModel::where('hours', 'like', '%–%')
            ->chunk(100, function ($records) use (&$updatedCount) {
                foreach ($records as $record) {
                    $originalHours = $record->hours;
                    $fixedHours = str_replace('–', '-', $originalHours);
                    if ($originalHours !== $fixedHours) {
                        $record->hours = $fixedHours;
                        $record->save();
                        $updatedCount++;
                    }
                }
            });

        $this->info("成功更新 {$updatedCount} 条记录!");
        return 0;
    }
}

最后运行命令即可:

php artisan fix:hours-dashes
3. PHP动态转换(不修改数据库的方案)

如果不想改动数据库,只想在读取数据时自动转换,可以给模型加一个访问器:

// 在你的业务模型类中添加
public function getHoursAttribute($value)
{
    // 把长破折号替换成短破折号,还可以顺便处理其他类似Unicode字符
    return str_replace(['–', '—', '-'], '-', $value);
}

这样每次调用$model->hours时,都会自动返回转换后的字符串,适合不想动数据库的场景,但缺点是每次读取都要处理,不如前两种一次性处理高效。

额外小提示

有时候Google Places还可能返回其他类似的Unicode破折号(比如em dash —、全角破折号 -),可以把这些都加入替换列表,避免后续再踩坑。

内容的提问来源于stack exchange,提问作者Zach Handley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:38