PHP批量修改MySQL数据表字符集为utf8mb4/utf8mb4_unicode_ci

编码大全

可参考我之前的文章:
快速理解ASCII、GBK、Unicode、UTF-8、ANSI

批量修改

注意这是DDL操作,操作过程会锁表(元数据锁),平均1秒能够转码3张表(数据量不大)。

亲测操作过后没有数据异常,推荐执行前备份。

php 复制代码
//接手一些老项目,需要修改编码。
$host = '';
$db   = '';
$user = '';
$pass = '';
$charset = 'utf8mb4';
$collate = 'utf8mb4_unicode_ci';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 从information_schema获取所有的表名
    $stmt = $pdo->query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '$db'");
    $tables = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);

    // 遍历所有的表并修改其编码
    foreach ($tables as $table) {
        $sql = "ALTER TABLE `$table` CONVERT TO CHARACTER SET $charset COLLATE $collate;";
        $pdo->exec($sql);
        echo "{$table}    ====>    {$charset}/{$collate}" . PHP_EOL;
    }

} catch (PDOException $e) {
    die("MySQL连接失败" . $e->getMessage());
}

最后别忘了执行数据库本身的转码操作。

sql 复制代码
ALTER DATABASE my_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
相关推荐
玄尺_0074 分钟前
bug:uniCloud报Business Failed, 参数有误retry invoke error
数据库·bug
bobz9654 分钟前
tcp 状态机
后端
@CLoudbays_Martin116 分钟前
CDN是否能有效检测并且同时防御Ddos 和 CC 攻击?
java·服务器·网络·数据库·git·数据库开发·时序数据库
阿杆15 分钟前
文心快码 3.5S 发布!实测插件开发,Architect 模式令人惊艳
前端·后端·文心快码
文心快码BaiduComate16 分钟前
我用Comate搭建「公园找搭子」神器,再也不孤单啦~
前端·后端·微信小程序
河南博为智能科技有限公司23 分钟前
单串口服务器-工业级串口联网解决方案
运维·服务器·物联网·边缘计算
爱喝水的鱼丶29 分钟前
SAP-MM:SAP采购组织全面学习指南:从概念到实战配置图解
运维·开发语言·数据库·学习·sap·mm模块·采购组织
Rum_0M31 分钟前
服务器内部信息获取
运维·服务器·web安全·网络安全·信息安全·职业技能大赛
Wy_编程36 分钟前
高并发服务器-多路IO转接-select
服务器·select·高并发
深鱼~1 小时前
DbGate数据库管理新方案:cpolar打造跨平台远程访问通道
数据库