【重學 MySQL】九十三、MySQL的字符集的修改與底層原理詳解

【重學 MySQL】九十三、MySQL的字符集的修改與底層原理詳解

  • 一、字符集修改方法
    • 1. **配置文件修改**
    • 2. **SQL命令修改**
    • 3. **數據遷移方案**
  • 二、底層原理與注意事項
    • 1. **字符集與排序規則**
    • 2. **存儲與性能影響**
    • 3. **數據一致性風險**
  • 三、常見問題解決
    • 1. **亂碼問題**
    • 2. **性能優化**
    • 3. **應用程序適配**
  • 四、總結

一、字符集修改方法

1. 配置文件修改

  • 步驟

    1. 編輯MySQL配置文件(my.cnfmy.ini),在[mysqld]段添加以下配置:
      [mysqld]
      character-set-server=utf8mb4
      collation-server=utf8mb4_unicode_ci
      
    2. 重啟MySQL服務以使配置生效:
      sudo systemctl restart mysql
      
    3. 驗證配置是否生效:
      SHOW VARIABLES LIKE 'character_set_%';
      SHOW VARIABLES LIKE 'collation_%';
      
  • 適用場景:全局默認字符集設置,適用于新創建的數據庫和表。

2. SQL命令修改

  • 修改數據庫字符集

    ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 修改表字符集

    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 修改列字符集

    ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 注意事項

    • ALTER TABLE ... CONVERT TO 會修改表結構和數據,需謹慎操作。
    • 修改列字符集時,需明確指定數據類型(如VARCHAR(255))。

3. 數據遷移方案

  • 步驟

    1. 導出表結構
      mysqldump -u root -p --default-character-set=gbk -d database_name > table_structure.sql
      
    2. 修改字符集定義:在導出的SQL文件中,將CHARSET=gbk替換為CHARSET=utf8mb4
    3. 導出數據
      mysqldump -u root -p --default-character-set=gbk --no-create-info database_name > table_data.sql
      
    4. 導入數據到新表
      mysql -u root -p new_database < table_structure.sql
      mysql -u root -p new_database < table_data.sql
      
  • 適用場景:已存在數據且需保留數據的字符集修改。

二、底層原理與注意事項

1. 字符集與排序規則

  • 字符集:定義字符的存儲方式,如utf8mb4支持4字節字符(包括emoji),而utf8僅支持3字節。

  • 排序規則:決定字符串的比較和排序規則,如utf8mb4_unicode_ci不區分大小寫,utf8mb4_bin區分大小寫。

  • 查看支持字符集

    SHOW CHARACTER SET;
    
  • 查看排序規則

    SHOW COLLATION WHERE Charset = 'utf8mb4';
    

2. 存儲與性能影響

  • 存儲開銷
    • utf8mb4字段占用更多空間。例如,CHAR(10)字段在utf8mb4下需40字節,而utf8需30字節。
  • 性能影響
    • 索引可能因字符集修改而失效,需重新構建索引。
    • 查詢性能可能下降,尤其在處理大量數據時。

3. 數據一致性風險

  • 亂碼問題
    • 原因:字符集不匹配(如客戶端使用utf8,而數據庫使用latin1)。
    • 解決:確保客戶端、連接、數據庫、表、列的字符集一致。
  • 數據截斷
    • 修改字符集后,若原字符集不支持某些字符(如emoji),可能導致數據丟失。
  • 備份與測試
    • 修改前務必備份數據,并在測試環境驗證方案。

三、常見問題解決

1. 亂碼問題

  • 檢查字符集設置
    SHOW VARIABLES LIKE 'character_set_%';
    SHOW VARIABLES LIKE 'collation_%';
    
  • 強制設置連接字符集
    SET NAMES 'utf8mb4';
    

2. 性能優化

  • 選擇合適字符集
    • 對不需要4字節字符的場景,優先使用utf8以節省空間。
  • 索引優化
    • 避免在頻繁查詢的字段上使用過長字符集(如VARCHAR(255))。

3. 應用程序適配

  • 連接配置
    • 在應用程序中顯式指定字符集(如JDBC的useUnicode=true&characterEncoding=UTF-8)。
  • 兼容性測試
    • 修改字符集后,測試應用程序對特殊字符(如emoji)的支持。

四、總結

  • 推薦字符集:優先使用utf8mb4以支持全Unicode字符,避免未來擴展問題。
  • 修改策略
    • 新建數據庫:通過配置文件設置全局默認字符集。
    • 已有數據庫:通過ALTER命令或數據遷移方案,并確保數據一致性。
  • 風險規避:備份數據、測試環境驗證、逐步部署。

通過以上方法,可安全高效地修改MySQL字符集,確保數據存儲與處理的正確性及性能優化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pdf 轉圖片工具實現

一、安裝 sudo yum install poppler-utils pdftoppm -v pdftoppm -png -r 300 a.pdf /tmp/page 運行效果&#xff1a; PDF轉圖片工具 - 在線PDF轉PNG/JPG/TIFF轉換器 | 免費在線工具 后臺實現&#xff1a; using System.Diagnostics; using System.IO.Compression;namespac…

Zynq開發實踐(FPGA之輸入、輸出整合)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】fpga開發的時候習慣上先把功能拆分成若干個模塊。針對這些模塊&#xff0c;一個一、個實現好之后&#xff0c;再用wire連接即可。這一點有點像軟件編…

【Linux基礎】深入理解計算機啟動原理:MBR主引導記錄詳解

目錄 引言 1 硬盤分區初始化概述 1.1 為什么需要硬盤分區 1.2 硬盤分區格式的發展 1.3 分區初始化的基本流程 2 MBR詳解 2.1 MBR的定義與位置 2.2 MBR的結構詳解 2.3 分區表結構詳解 2.4 MBR的工作原理 2.5 MBR的引導程序 3 MBR的局限性 3.1 硬盤容量限制 3.2 分…

Linux 線程同步

線程同步 由于線程共享內存&#xff0c;訪問共享數據&#xff08;全局變量、堆內存&#xff09;必須進行同步&#xff0c;以防止競態條件&#xff08;Race Conditions&#xff09;導致數據不一致或程序崩潰。 子線程沒有獨立的地址空間&#xff0c;數據通常是共享的&#xff1b…

世界模型的典型框架與分類

1.概述 人類和動物智能的一個重要方面是我們對世界的內部模型。我們使用這個模型來預測我們的行為將如何影響我們的環境&#xff0c;預測未來的事件&#xff0c;并計劃復雜的行動序列以實現目標。當前大多數機器學習研究都集中在被動理解數據的模型上&#xff0c;例如圖像分類…

【Day 35】Linux-Mysql錯誤總結

&#xff08;一&#xff09;MySQL 基礎操作與服務故障類 連接層錯誤&#xff08;客戶端與服務器的連接建立失敗&#xff09; 解決 socket 路徑、文件存在性及服務可用性問題。 1、MySQL 客戶端連接失敗&#xff08;報錯 “Cant connect to local MySQL server throgh socket…

MYSQL速通(2/5)

六、多表查詢1、多表關系①、一對多&#xff08;多對一&#xff09;舉例&#xff1a;一個部門對多個員工實現&#xff1a;多的那邊建立外鍵&#xff0c;指向一的那邊的主鍵②、多對多舉例&#xff1a;一個學生可選多門課&#xff0c;一門課可被多個學生選實現&#xff1a;建立中…

CRM、ERP、HRP系統有啥區別?

要理解CRM、ERP、HRP系統&#xff0c;需先明確三者的核心定位&#xff08;聚焦客戶、企業全資源、特定領域資源&#xff09;&#xff0c;再從管理范圍、目標、用戶等維度區分。以下是詳細解析&#xff1a; 一、各系統核心定義與核心模塊 1. CRM系統&#xff1a;客戶關系管理系統…

【系統分析師】高分論文:論系統測試技術及應用

【摘要】 2022 年 7月&#xff0c;我作為項目負貴人&#xff0c;參加了某銀行的統計數據發布系統建設項目。該項目合同金額230 萬元&#xff0c;合同工期為半年。統計數據發布系統的主要目標是為該行建設一個企業級的數據統計、分析、發布平臺&#xff0c;實現定制化的數據應用…

第5篇 c++ 函數的多返回值實現-返回多個值

c 函數的多返回值實現std::tuple<Mat, int, double, std::string> AuatoPafackSydstem::GetMatchingValue(Mat mat_img, std::string img_template_path) {Mat a;return {a,1,0.001,""}; }std::tuple<Mat, int, double, std::string> GetMatchingValue(M…

C++基礎(⑤刪除鏈表中的重復節點(鏈表 + 遍歷))

題目描述 給定一個排序好的鏈表&#xff08;升序&#xff09;&#xff0c;刪除所有重復的元素&#xff0c;使每個元素只出現一次。 示例&#xff1a; 輸入&#xff1a;1 → 1 → 2 → 3 → 3 輸出&#xff1a;1 → 2 → 3 解題思路 核心觀察&#xff1a;鏈表已排序&#xff0c;…

摩搭api 實現

AI圖片生成器前端實現詳解本文詳細解析一個功能完整的AI圖片生成器前端實現&#xff0c;包含主題切換、參數配置、圖片生成與預覽等核心功能。項目概述 這是一個基于ModelScope平臺的AI圖片生成器前端實現&#xff0c;用戶可以通過輸入提示詞、選擇模型和調整參數來生成高質量圖…

c++--線程休眠/sleep

線程休眠<unistd.h>--sleep()<thread>--std::this_thread::sleep_for()ros--rclcpp::sleep_for()以上的三個sleep也就是休眠會占用CPU嗎簡單直接的回答是&#xff1a;不會。一個正確使用、正在休眠的線程不會占用CPU資源。核心原理當你調用像 std::this_thread::sl…

人工智能基礎概念

The brain happens to be a meat machine. —— Marvin Lee Minsky 目錄 人類智能 人工智能 三個階段 三大學派 四個要素 關系辨析 維度分類 發展簡史 技術方向 應用領域 產業圖譜 發展趨勢 人類智能 人工智能的目的是通過探索智慧的實質&#xff0c;擴展人類智能…

企業數字資產管理怎么轉型更高效?一文打通策略與實踐

核心要點 問題&#xff1a; 傳統的內容管理方式效率低、協作難、版本混亂&#xff0c;企業轉型 DAM 系統面臨選型難和落地難兩大挑戰。 答案&#xff1a; 采用階段性轉型策略&#xff0c;結合智能化工具和標準化流程&#xff0c;能幫助企業構建可擴展、易協作、強治理的內容資…

python pyqt5開發DoIP上位機【源碼】

目錄 文章合集 文章合集 python pyqt5開發DoIP上位機【介紹】 python pyqt5開發DoIP上位機【代碼里發送常用uds命令是怎么實現的?】 python pyqt5開發DoIP上位機【代碼里是怎么獲取診斷回復的?】 python pyqt5開發DoIP上位機【診斷回復的函數都是怎么調用的?】 python …

IIC (I2C)通信

一、IIC的特點I2C&#xff08;Inter IC Bus&#xff09;又成為&#xff08;愛方C I2C&#xff09;是由Philips公司開發的一種通用數據總線兩根通信線&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09;同步&#xff0c;半雙工帶數據…

【圖像處理 - 基礎知識】ISP(Image Signal Processor)處理

文章目錄1. 圖像傳感背景2. 圖像數據格式2.1. 【RAW】Bayer濾色陣列&#xff08;Bayer Filter Array&#xff09;2.2. 【RGB】2.3. 【YUV】3. ISP&#xff08;Image Signal Processor&#xff09;3.1. ISP定義3.2. 分類概括1 RAW 域&#xff08;Raw Domain&#xff09;2 RGB 域…

PostgreSQL 數據庫災備要點與舉例說明**

PostgreSQL 數據庫災備要點與舉例說明 數據庫災備(Disaster Recovery, DR)是確保業務連續性的核心環節,其目標是在主生產環境遭遇計劃外中斷(如硬件故障、自然災害、人為錯誤、數據損壞)時,能快速恢復數據和服務。PostgreSQL 因其強大和開源特性,提供了多種高效的災備方…

【GaussDB】在邏輯復制中剔除指定用戶的事務

【GaussDB】在邏輯復制中剔除指定用戶的事務 1. 需求背景 在邏輯復制中&#xff0c;期望對源端指定用戶的所有操作不復制到目標端。然而WAL日志中沒有用戶信息可用于過濾&#xff0c;因此考慮結合審計日志來實現這一需求。 2. 解決方案 2.1 配置審計日志 首先需要開啟事務…