亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL批量替換數(shù)據(jù)庫(kù)字符集的實(shí)用方法(附詳細(xì)代碼)

 更新時(shí)間:2025年09月22日 11:26:01   作者:禹跡  
當(dāng)需要修改數(shù)據(jù)庫(kù)編碼和字符集時(shí),通常需要對(duì)其下屬的所有表及表中所有字段進(jìn)行修改,下面這篇文章主要介紹了MySQL批量替換數(shù)據(jù)庫(kù)字符集的實(shí)用方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在日常的數(shù)據(jù)庫(kù)運(yùn)維或系統(tǒng)遷移過(guò)程中,我們經(jīng)常會(huì)遇到這樣的問(wèn)題:

數(shù)據(jù)庫(kù)和表的字符集不統(tǒng)一,或者需要統(tǒng)一升級(jí)到更合適的字符集(例如 utf8mb4)以支持更多字符。

手動(dòng)逐個(gè)表、逐個(gè)字段修改字符集不僅耗時(shí),還容易遺漏。本文將通過(guò)一段 SQL 腳本,向大家介紹如何批量替換 MySQL 數(shù)據(jù)庫(kù)的字符集,從而簡(jiǎn)化操作并降低風(fēng)險(xiǎn)。

為什么要批量修改字符集?

  1. 統(tǒng)一性:確保所有表和字段的字符集一致,避免查詢或插入時(shí)出現(xiàn)亂碼。
  2. 兼容性:例如 utf8 在 MySQL 實(shí)際上只支持最多 3 字節(jié),而 utf8mb4 才是真正的 UTF-8,可以支持 Emoji 等四字節(jié)字符。
  3. 可維護(hù)性:統(tǒng)一的標(biāo)準(zhǔn)字符集讓團(tuán)隊(duì)協(xié)作和后期維護(hù)更加方便。

整體腳本

-- 替換為你的數(shù)據(jù)庫(kù)名
SET @db_name = '你的數(shù)據(jù)庫(kù)名';
SET @charset = 'utf8mb4';
SET @collation = 'utf8mb4_unicode_520_ci';

-- 生成修改表默認(rèn)字符集的語(yǔ)句
SELECT CONCAT(
    'ALTER TABLE `', table_name, '` DEFAULT CHARACTER SET ', @charset, ' COLLATE ', @collation, ';'
) AS alter_table_sql
FROM information_schema.tables 
WHERE table_schema = @db_name 
  AND table_type = 'BASE TABLE'; -- 只處理用戶表,排除視圖等

-- 生成修改所有字符串字段的語(yǔ)句
SELECT CONCAT(
    'ALTER TABLE `', c.table_name, '` MODIFY COLUMN `', c.column_name, '` ',
    c.data_type, 
    IF(c.character_maximum_length IS NOT NULL, CONCAT('(', c.character_maximum_length, ')'), ''),
    ' CHARACTER SET ', @charset, ' COLLATE ', @collation,
    IF(c.is_nullable = 'NO', ' NOT NULL', ' NULL'),
    IF(c.column_default IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(c.column_default)), ''),
    ' COMMENT ', QUOTE(c.column_comment), ';'
) AS alter_column_sql
FROM information_schema.columns c
JOIN information_schema.tables t ON c.table_name = t.table_name AND c.table_schema = t.table_schema
WHERE c.table_schema = @db_name
  AND t.table_type = 'BASE TABLE'
  AND c.data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext') -- 所有字符串類型
  AND (c.character_set_name IS NULL OR c.character_set_name != @charset OR c.collation_name != @collation);

腳本邏輯解析

以下腳本分為兩部分,分別用于生成修改 表的默認(rèn)字符集字段字符集 的 SQL 語(yǔ)句。

1. 設(shè)置目標(biāo)參數(shù)

-- 替換為你的數(shù)據(jù)庫(kù)名
SET @db_name = '你的數(shù)據(jù)庫(kù)名';
SET @charset = 'utf8mb4';
SET @collation = 'utf8mb4_unicode_520_ci';
  • @db_name:要操作的數(shù)據(jù)庫(kù)名。
  • @charset:目標(biāo)字符集。這里我們指定為 utf8mb4。
  • @collation:排序規(guī)則,推薦使用 utf8mb4_unicode_520_ci,兼容性和排序效果更好。

2. 生成修改表默認(rèn)字符集的語(yǔ)句

SELECT CONCAT(
    'ALTER TABLE `', table_name, '` DEFAULT CHARACTER SET ', @charset, ' COLLATE ', @collation, ';'
) AS alter_table_sql
FROM information_schema.tables 
WHERE table_schema = @db_name 
  AND table_type = 'BASE TABLE'; -- 只處理用戶表,排除視圖等

這段 SQL 會(huì)從 information_schema.tables 中讀取所有用戶表,并生成相應(yīng)的 ALTER TABLE 語(yǔ)句。
作用是修改表的默認(rèn)字符集和排序規(guī)則,這樣以后新建字段時(shí)會(huì)自動(dòng)使用指定的字符集。

3. 生成修改所有字符串字段的語(yǔ)句

SELECT CONCAT(
    'ALTER TABLE `', c.table_name, '` MODIFY COLUMN `', c.column_name, '` ',
    c.data_type, 
    IF(c.character_maximum_length IS NOT NULL, CONCAT('(', c.character_maximum_length, ')'), ''),
    ' CHARACTER SET ', @charset, ' COLLATE ', @collation,
    IF(c.is_nullable = 'NO', ' NOT NULL', ' NULL'),
    IF(c.column_default IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(c.column_default)), ''),
    ' COMMENT ', QUOTE(c.column_comment), ';'
) AS alter_column_sql
FROM information_schema.columns c
JOIN information_schema.tables t ON c.table_name = t.table_name AND c.table_schema = t.table_schema
WHERE c.table_schema = @db_name
  AND t.table_type = 'BASE TABLE'
  AND c.data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext') -- 所有字符串類型
  AND (c.character_set_name IS NULL OR c.character_set_name != @charset OR c.collation_name != @collation);

這段 SQL 主要針對(duì)已有的字符串字段,逐一生成 ALTER TABLE ... MODIFY COLUMN 語(yǔ)句:

  • 只選擇了 字符串類型字段varchar, char, text 等)。
  • 保留了原有的字段長(zhǎng)度(character_maximum_length)。
  • 保留了字段是否可為空(is_nullable)。
  • 保留了默認(rèn)值(column_default)。
  • 保留了字段注釋(column_comment)。
  • 僅在字段字符集或排序規(guī)則與目標(biāo)不一致時(shí)才生成語(yǔ)句,避免重復(fù)修改。

使用步驟

  1. 替換數(shù)據(jù)庫(kù)名
    將腳本中的 SET @db_name = '你的數(shù)據(jù)庫(kù)名'; 修改為實(shí)際要操作的數(shù)據(jù)庫(kù)名。

  2. 執(zhí)行腳本
    在 MySQL 客戶端或工具(如 Navicat、DBeaver)中運(yùn)行以上 SQL。

  3. 復(fù)制結(jié)果并執(zhí)行
    腳本本身不會(huì)直接修改數(shù)據(jù)庫(kù),而是生成一批 ALTER 語(yǔ)句。
    你需要將結(jié)果導(dǎo)出或復(fù)制出來(lái),再次執(zhí)行這些 ALTER 語(yǔ)句,才能真正完成修改。

示例輸出

假設(shè)數(shù)據(jù)庫(kù) test_db 有一張 users 表,里面有一個(gè) name 字段:

執(zhí)行腳本后可能會(huì)生成如下語(yǔ)句:

ALTER TABLE `users` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

ALTER TABLE `users` MODIFY COLUMN `name` varchar(255) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL 
COMMENT '用戶名';

結(jié)果1替換表的字符集,結(jié)果2替換字段的字符集

注意事項(xiàng)

  1. 備份數(shù)據(jù):在批量修改前,一定要做好數(shù)據(jù)庫(kù)備份,以防萬(wàn)一。
  2. 鎖表風(fēng)險(xiǎn)ALTER TABLE 會(huì)對(duì)表加鎖,大表執(zhí)行時(shí)可能會(huì)阻塞業(yè)務(wù),建議在業(yè)務(wù)低峰期操作。
  3. 兼容性驗(yàn)證:部分排序規(guī)則在 MySQL 版本之間可能有所差異,請(qǐng)確認(rèn)目標(biāo)環(huán)境支持。

總結(jié) 

到此這篇關(guān)于MySQL批量替換數(shù)據(jù)庫(kù)字符集的實(shí)用方法的文章就介紹到這了,更多相關(guān)MySQL批量替換數(shù)據(jù)庫(kù)字符集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux系統(tǒng)利用crontab定時(shí)備份Mysql數(shù)據(jù)庫(kù)方法

    Linux系統(tǒng)利用crontab定時(shí)備份Mysql數(shù)據(jù)庫(kù)方法

    本文教你如果快速利用系統(tǒng)crontab來(lái)定時(shí)執(zhí)行備份文件,按日期對(duì)備份結(jié)果進(jìn)行保存
    2021-09-09
  • MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn)

    MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn)

    本文主要介紹了MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn),詳細(xì)的介紹了為什么IN這么慢以及如何優(yōu)化,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-07-07
  • MySQL5.7并行復(fù)制原理及實(shí)現(xiàn)

    MySQL5.7并行復(fù)制原理及實(shí)現(xiàn)

    MySQL 5.7并行復(fù)制的思想簡(jiǎn)單易懂,本文就詳細(xì)的介紹了MySQL5.7并行復(fù)制原理及實(shí)現(xiàn),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • MySQL 回表,覆蓋索引,索引下推

    MySQL 回表,覆蓋索引,索引下推

    這篇文章主要介紹了MySQL 回表,覆蓋索引,索引下推,就是我們需要查詢的數(shù)據(jù)都在二級(jí)索引樹(shù)中,直接返回這種情況就叫做覆蓋索引
    2022-07-07
  • linux Xtrabackup安裝及使用方法

    linux Xtrabackup安裝及使用方法

    Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品
    2013-04-04
  • 幾個(gè)常見(jiàn)的MySQL的可優(yōu)化點(diǎn)歸納總結(jié)

    幾個(gè)常見(jiàn)的MySQL的可優(yōu)化點(diǎn)歸納總結(jié)

    這篇文章主要介紹了幾個(gè)常見(jiàn)的MySQL的可優(yōu)化點(diǎn)歸納總結(jié),包括在編程時(shí)處理索引、分頁(yè)以及數(shù)據(jù)類型時(shí)可用到的地方,需要的朋友可以參考下
    2015-05-05
  • MySql中怎樣查詢表是否被鎖

    MySql中怎樣查詢表是否被鎖

    這篇文章主要介紹了MySql中怎樣查詢表是否被鎖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL索引總結(jié)(Index?Type)

    MySQL索引總結(jié)(Index?Type)

    本文主要介紹了MySQL索引總結(jié)(Index?Type),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 解決mysql數(shù)據(jù)庫(kù)導(dǎo)入sql文件不成功的問(wèn)題

    解決mysql數(shù)據(jù)庫(kù)導(dǎo)入sql文件不成功的問(wèn)題

    這篇文章主要介紹了解決mysql數(shù)據(jù)庫(kù)導(dǎo)入sql文件不成功的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySQL回表的性能傷害程度有多大

    MySQL回表的性能傷害程度有多大

    這篇文章主要介紹了MySQL回表的性能傷害程度有多大?下面我們就帶著疑問(wèn)進(jìn)入下面文章了解詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-02-02

最新評(píng)論