MySQL 類型轉換與加密函數深度解析

MySQL 類型轉換與加密函數深度解析


一、類型轉換函數詳解

1. 顯式類型轉換

CAST 函數
CAST(expression AS type)
  • 支持類型:BINARY, CHAR, DATE, DATETIME, TIME, DECIMAL, SIGNED [INTEGER], UNSIGNED [INTEGER]
  • 示例:
    SELECT CAST('2023-08-15' AS DATE); -- 2023-08-15
    SELECT CAST(123.456 AS DECIMAL(5,2)); -- 123.46 (四舍五入)
    SELECT CAST('123' AS SIGNED); -- 123
    SELECT CAST(123 AS CHAR); -- '123'
    
CONVERT 函數
CONVERT(expression, type)
CONVERT(expression USING charset)
  • 兩種形式:類型轉換和字符集轉換
  • 示例:
    SELECT CONVERT('abc' USING utf8mb4); -- 字符集轉換
    SELECT CONVERT(123.456, DECIMAL(5,2)); -- 123.46
    

2. 隱式類型轉換

MySQL 在以下場景自動轉換類型:

  • 數值計算:'10' + 5 → 15
  • 字符串連接:CONCAT('ID:', 100) → 'ID:100'
  • 比較操作:WHERE int_column = '123'

3. 格式化函數

FORMAT(number, decimal_places) -- 數字格式化
DATE_FORMAT(date, format)      -- 日期格式化
  • 示例:
    SELECT FORMAT(1234567.89, 2); -- '1,234,567.89'
    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- '2025-06-17 14:30:45'
    

4. 二進制轉換函數

函數描述示例
BIN()十進制轉二進制BIN(10) → '1010'
HEX()轉十六進制HEX(255) → 'FF'
OCT()轉八進制OCT(8) → '10'
CONV(num, from_base, to_base)任意進制轉換CONV('A',16,10) → '10'

5. 類型轉換注意事項

  1. 精度丟失

    SELECT CAST(123.789 AS UNSIGNED); -- 123 (小數部分截斷)
    
  2. 日期轉換陷阱

    SELECT CAST('2023-02-30' AS DATE); -- NULL (非法日期)
    
  3. 字符集不一致

    SELECT CAST(_utf8'你好' AS CHAR CHARACTER SET latin1); -- 亂碼
    
  4. 性能影響

    -- 避免在WHERE條件中使用轉換(索引失效)
    SELECT * FROM orders WHERE CAST(order_id AS CHAR) = '1001';
    

二、加密函數詳解

1. 不可逆哈希函數

函數算法輸出長度特點
MD5()MD532字符已不推薦用于安全場景
SHA1()SHA-140字符安全漏洞,不推薦
SHA2()SHA-2可選長度推薦使用
SHA2 使用詳解
SHA2(str, hash_length) -- hash_length: 224, 256, 384, 512

示例:

SELECT SHA2('password', 256); 
-- '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8'

2. 可逆加密函數

AES 加解密
-- 加密(結果以二進制存儲)
SELECT AES_ENCRYPT('secret', 'encryption_key');-- 解密
SELECT CAST(AES_DECRYPT(encrypted_data, 'encryption_key') AS CHAR);

最佳實踐:

  1. 使用VARBINARY類型存儲加密數據
  2. 密鑰長度:128, 192或256位
  3. 示例完整流程:
    CREATE TABLE secure_data (id INT PRIMARY KEY,secret VARBINARY(200)
    );INSERT INTO secure_data 
    VALUES (1, AES_ENCRYPT('信用卡號', 'my_secure_key'));SELECT id, CAST(AES_DECRYPT(secret, 'my_secure_key') AS CHAR) 
    FROM secure_data;
    

3. 密碼存儲專用函數

推薦方案:bcrypt(需應用層實現)

MySQL內置方案:

-- 創建密碼哈希
CREATE USER 'test'@'localhost' 
IDENTIFIED WITH mysql_native_password BY 'password';-- 模擬密碼驗證
SELECT PASSWORD('password'); -- 生成哈希(已廢棄)

4. 其他加密函數

函數用途注意事項
ENCODE()/DECODE()簡單加密已廢棄,不安全
DES_ENCRYPT()DES加密需要SSL支持
COMPRESS()數據壓縮非加密函數,但常配合使用
UNCOMPRESS()解壓數據需處理NULL值

5. 加密函數安全準則

  1. 密鑰管理

    • 切勿硬編碼密鑰
    • 使用MySQL密鑰環或外部密鑰管理服務
  2. 算法選擇

    • 優先選擇AESSHA2
    • 棄用MD5SHA1DES
  3. 數據存儲

    -- 正確設置二進制字段
    CREATE TABLE user_secrets (user_id INT,secret VARBINARY(256) -- 足夠存儲加密后數據
    );
    
  4. 傳輸安全

    • 始終使用SSL/TLS連接
    • 啟用require_secure_transport

三、綜合應用案例

安全數據存儲系統

-- 創建安全表
CREATE TABLE financial_records (record_id INT AUTO_INCREMENT PRIMARY KEY,plain_text VARCHAR(100), -- 非敏感數據encrypted_data VARBINARY(256), -- AES加密數據data_hash CHAR(64) -- SHA256校驗值
);-- 插入加密記錄
INSERT INTO financial_records (plain_text, encrypted_data, data_hash)
VALUES ('交易摘要',AES_ENCRYPT('卡號:1234 余額:$5000', 'my_super_secret_key'),SHA2('卡號:1234 余額:$5000', 256)
);-- 查詢驗證與解密
SELECT plain_text,CAST(AES_DECRYPT(encrypted_data, 'my_super_secret_key') AS decrypted_data,data_hash = SHA2(CAST(AES_DECRYPT(encrypted_data, 'my_super_secret_key') AS CHAR), 256) AS hash_verified
FROM financial_records;

四、常見錯誤及解決方案

類型轉換錯誤

-- 錯誤:轉換失敗
SELECT CAST('abc' AS UNSIGNED); -- 結果為0-- 安全轉換函數(自定義)
CREATE FUNCTION safe_cast_int(str VARCHAR(20))
RETURNS INT DETERMINISTIC
BEGINRETURN CAST(str AS SIGNED); -- 簡單示例,實際需更復雜校驗
END;

加密數據截斷

-- 錯誤:加密后數據超出字段容量
CREATE TABLE small_table (data VARBINARY(10) -- 太小
);
INSERT INTO small_table 
VALUES (AES_ENCRYPT('long data...', 'key')); -- 可能截斷-- 解決方案:計算最大長度
SELECT MAX(LENGTH(AES_ENCRYPT('your data', 'key')));

密鑰輪換問題

-- 多密鑰支持表設計
CREATE TABLE key_management (key_id INT PRIMARY KEY,key_value VARBINARY(256),active BOOL
);-- 解密時嘗試多個密鑰
SELECT COALESCE(CAST(AES_DECRYPT(data, key1) AS CHAR),CAST(AES_DECRYPT(data, key2) AS CHAR)) AS decrypted
FROM records;

五、性能優化建議

  1. 加密代價

    -- 批量加密避免重復連接
    SET @key = 'key';
    INSERT INTO secure_table
    SELECT AES_ENCRYPT(data, @key) 
    FROM large_table;
    
  2. 索引限制

    • 加密字段無法有效索引
    • 解決方案:添加哈希值索引
    ALTER TABLE users 
    ADD COLUMN email_hash BINARY(32) AS (UNHEX(SHA2(email, 256))) VIRTUAL,
    ADD INDEX idx_email_hash (email_hash);
    
  3. 硬件加速

    • 啟用AES-NI指令集(服務器配置)
    • 使用專用加密硬件

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

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

相關文章

FPGA基礎 -- Verilog 行為級建模之條件語句

Verilog 的行為級建模(Behavioral Modeling)中的條件語句(Conditional Statements),逐步從基礎到實際工程應用,適合有RTL開發基礎但希望深入行為建模的人。 一、行為級建模簡介 行為級建模(Beh…

linux618 NFS web.cn NFS.cn backup.cn

權限問題 推測 ssh root登錄失敗 root192.168.235.100s password: ???????? root192.168.235.100s password: ???????? root192.168.235.100s password: ???????? root192.168.235.100s password: ???????? root192.168.235.100s password: …

氧化鐿:稀土科技的“夜視高手”

氧化鐿(Yb?O?)是一種重要的稀土氧化物,這種略帶黃色的粉末,既不像黃金那樣耀眼,也不像稀土家族里的“明星”如釹、鋱那樣廣為人知,卻在背后默默支撐著許多高科技產業,特別是在紅外技術領域&am…

class對象【C#】2025復習

對象 西方思想是:復雜的事讓秘書去做就行。老板只需簡單的下達命令。 代碼格式如下 秘書類型 秘書A new 秘書類型(); . 秘書A.開始工作(); // 調用實例對象的方法。 特別注意的是,程序只會用到 秘書A,秘書B&…

Qt程序啟動動畫

一、Qt有3種方式實現程序啟動動畫(介紹) 1、QSplashScreen 靜態圖片(png、jpg等格式) 2、QMovie 動態圖片(gif格式) 3、QAxWidget 視頻(swf格式) 1.QSplashScreen 靜態圖片(png、jpg等格式) //創建啟動動畫類實例 QSplashScreen splash(QPixmap(&qu…

貪心算法經典問題

目錄 貪心思想 一、Dijkstra最短路問題 問題描述: 貪心策略: 二、Prim 和 Kruskal 最小生成樹問題 Prim 算法: Kruskal 算法: 三、Huffman樹問題 問題描述: 貪心策略: 四、背包問題 問題描述&a…

零知開源——STM32F4實現ILI9486顯示屏UI界面系列教程(一):電子書閱讀器功能

本教程將詳細介紹如何在零知增強板上使用3.5寸ILI9486顯示屏實現電子書閱讀器功能。我們將使用LVGL庫構建用戶界面,并實現翻頁、進度顯示等核心功能。 目錄 一、硬件連接 二、軟件UI組件實現 三、零知IDE配置 四、演示效果 五、常見問題解決 六、總結與擴展 一…

支持selenium的chrome driver更新到137.0.7151.119

最近chrome釋放新版本:137.0.7151.119 如果運行selenium自動化測試出現以下問題,是需要升級chromedriver才可以解決的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

架構下的最終瓶頸:數據庫如何破局?

在分布式系統和云原生架構逐漸成熟的當下,我們已能夠靈活擴展計算資源、水平擴展服務節點、拆分業務模塊等。然而,在經歷過多輪架構優化之后,數據庫常常成為系統的“最后瓶頸”。尤其當數據量、并發量、實時性要求劇增時,數據庫即…

湖北理元理律師事務所小微企業債務重組方案:司法與經營的共生邏輯

小微企業債務問題常陷入“救企業還是保老板”的困局。湖北理元理律師事務所為某汽車零部件供應商設計的“經營性債務重組”方案,提供了創新解題思路。 核心矛盾拆解 該企業面臨三重困境: 矛盾類型 具體表現 法律風險等級 擔保鏈危機 老板個人擔保牽…

FastAdmin退出登錄不提示的修改方法

修改退出登錄后的提示行為 在FastAdmin中,默認退出登錄后會顯示"退出成功"的提示信息并跳轉頁面。要實現不顯示提示信息直接跳轉,可以通過以下方式修改: 方法一:修改控制器邏輯 找到application/admin/controller/Log…

工信部發布《中國工業軟件產業發展研究報告(2025)》:PLM壟斷加劇,Ai為國產PLM軟件發展契機

在6月17日上午舉行的2025南京軟件大會開幕式上,工信部電子第五研究所現場發布《中國工業軟件產業發展研究報告(2025)》(以下簡稱《研究報告》),并從工業軟件產業發展現狀、產業發展趨勢,以及我國…

Flutter JSON解析全攻略:使用json_serializable實現高效序列化

引言:為什么我們需要JSON序列化工具? 在現代移動應用開發中,與服務器進行數據交互是必不可少的功能。JSON(JavaScript Object Notation)作為一種輕量級的數據交換格式,因其易讀性、簡潔性和廣泛支持性&…

shelve模塊的使用

shelve模塊的使用 1. 什么是Shelve2. Shelve模塊的數據存儲與讀取3. Shelve的讀取數據4. Shelve模塊的高級操作_ Shelve的數據更新和刪除5. 刪除操作可以使用del語句:6. Shelve的數據查詢和處理_使用for循環來遍歷Shelve對象中的所有鍵值對:7. Shelve模塊…

python大學校園舊物捐贈系統

目錄 技術棧介紹具體實現截圖系統設計研究方法:設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理,難度適中&#xf…

Python爬蟲實戰:研究eventlet庫相關技術

1. 引言 在當今信息爆炸的時代,網絡上的數據量呈現出指數級增長的趨勢。從海量的網絡信息中獲取有價值的數據并進行分析,對于企業決策、學術研究以及個人興趣等方面都具有重要意義。網絡爬蟲作為一種自動化獲取網頁內容的技術手段,應運而生并得到了廣泛的應用。 網絡爬蟲(…

文字識別接口-智能文本處理-文字提取技術

文字識別接口,顧名思義,就是一種將圖像文字或手寫文字轉換為可編輯文本的技術。文字識別接口,基于深度學習算法與自主ocr核心實現多種場景字符的高精度識別與結構化信息提取,現已被廣泛應用于銀行、醫療、財會、教育等多個領域。 …

Redis的持久化機制詳細解析

Redis的持久化機制詳細解析 今天我們來聊聊Redis的持久化機制。想象一下,你正在玩一個非常精彩的游戲,突然斷電了,如果沒有存檔功能,所有的進度都會丟失,是不是很崩潰? Redis作為內存數據庫,同…

2025年SYN-CC混合攻擊防御實戰:某金融平臺抵御800Gbps雙重風暴實錄

“你以為防住SYN Flood就能高枕無憂?新型SYN-CC混合鏈正在撕裂傳統防御體系!” 一、事件現場:一場精準的“協議層絞殺” 2025年5月,某跨境支付平臺遭遇史上首次SYN-CC混合攻擊,峰值流量達 800Gbps,核心交易…

JSON 編輯器:從語法到數據處理(二)

JSON 編輯器:從語法編寫到結構可視化(一)-CSDN博客 在上一篇中,我們了解了 JSON 的語法和編輯器,解決了 “怎么寫對 JSON” 的問題。 而實際開發中,更關鍵的是 “怎么高效處理 JSON 數據” —— 如何從商品…