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;
相关推荐
非优秀程序员29 分钟前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员29 分钟前
第06章 浙江帮的内战|《互联网产品恩仇录》
后端
非优秀程序员29 分钟前
第08章 马云的反击|《互联网产品恩仇录》
后端
非优秀程序员37 分钟前
题记|《互联网产品恩仇录》
后端·程序员·创业
非优秀程序员44 分钟前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
知已难寻1 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
Gopher_HBo4 小时前
Go CPU 剖析的"地基":信号、CAS、写屏障、无锁环形缓冲
后端
panbook5 小时前
从0到1实现一个分布式时序数据库(二):写入成功之后,如何用 WAL 找回数据
后端
Swot5 小时前
上传一张 4MB 图片,我先后撞上了三层请求体限制
后端
IT_陈寒5 小时前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端