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;
相关推荐
\光辉岁月/1 分钟前
7.mybatisplus学习-条件构造器、插件、通用枚举、多数据源环境、MybatisX
数据库·oracle
苏supper3 分钟前
记一次Nacos鉴权报错unknown user,403排查|SecurityProxy源码,fastjson2扩展包缺失
java·后端
承渊政道4 分钟前
云电脑连接异地MySQL:星空组网配置、端口验证与登录排障
数据库·mysql·电脑·星空组网
yexianglunbai5 分钟前
Redis 缓存详解:从原理到实战
数据库·redis·缓存
微信开发api6 分钟前
基于WTAPI构建社群运营平台:自动拉群与会话承接链路设计
java·大数据·网络·数据库·微信·自动化
奕鼎竜瑆9 分钟前
MCP Connectors by Databox 新手部署与调用指南
服务器·人工智能
天空'之城10 分钟前
单片机基础核心知识点汇总(四十六)
数据库·单片机·mongodb
Andreapiki10 分钟前
数字化审计校招技术备考指南:SQL、Python、BI、RPA学习路径
python·sql·rpa
冰暮流星14 分钟前
mysql之索引结构
数据库·mysql
闲云自留地15 分钟前
从结绳记事到 MySQL:数据库原理 + MySQL 基础一篇通
数据库·mysql