MySQL字符串截取的核心要點(diǎn)和注意事項(xiàng)
我將全面講解 MySQL 中字符串截取的核心要點(diǎn)和注意事項(xiàng):
核心截取函數(shù)
1.SUBSTRING()/SUBSTR()
-- 基本語法 SELECT SUBSTRING('MySQL Tutorial', 7, 5); -- 'Tutor' -- 負(fù)起始位置(從右向左) SELECT SUBSTRING('Database', -4, 4); -- 'base'
2.LEFT()&RIGHT()
SELECT LEFT('Hello World', 5); -- 'Hello' SELECT RIGHT('Hello World', 5); -- 'World'
3.SUBSTRING_INDEX()
-- 按分隔符截取 SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -- 'www.mysql'
八大關(guān)鍵注意事項(xiàng)
1.索引從1開始(不是0)
SELECT SUBSTRING('ABCDE', 1, 1); -- 'A' ? SELECT SUBSTRING('ABCDE', 0, 1); -- '' ?
2.多字節(jié)字符問題(中文/emoji)
-- UTF8中文字符(每個(gè)占3字節(jié)) SELECT SUBSTRING('中國(guó)', 2, 1); -- 亂碼('?') -- 解決方案:按字符截取 SELECT SUBSTRING('中國(guó)' FROM 2 FOR 1); -- '國(guó)' ?
3.長(zhǎng)度超限自動(dòng)修正
-- 實(shí)際截取長(zhǎng)度 = min(指定長(zhǎng)度, 剩余長(zhǎng)度) SELECT SUBSTRING('Short', 2, 10); -- 'hort'
4.NULL處理規(guī)則
SELECT SUBSTRING(NULL, 1, 3); -- NULL SELECT SUBSTRING('Text', NULL, 3); -- NULL
5.負(fù)起始位置計(jì)算
-- 公式:實(shí)際位置 = 字符串長(zhǎng)度 + 負(fù)起始值 + 1 SELECT SUBSTRING('Database', -3, 3); -- 'ase'(位置6開始)
6.性能陷阱(大數(shù)據(jù)量)
-- 避免在WHERE中直接截?。o法使用索引) SELECT * FROM users WHERE SUBSTRING(email, 5, 10) = 'example'; -- 優(yōu)化方案:使用前綴索引 ALTER TABLE users ADD INDEX idx_email_prefix (email(15)); SELECT * FROM users WHERE email LIKE 'exam%';
7.與CHAR_LENGTH的區(qū)別
SELECT LENGTH('中國(guó)'), -- 6字節(jié)(UTF8) CHAR_LENGTH('中國(guó)'), -- 2字符 SUBSTRING('中國(guó)', 2, 1); -- 截取第2字節(jié)(亂碼)
8.日期/數(shù)字轉(zhuǎn)換問題
-- 數(shù)字需先轉(zhuǎn)為字符串 SELECT SUBSTRING(20230815, 5, 2); -- 錯(cuò)誤(數(shù)字截取) SELECT SUBSTRING(CAST(20230815 AS CHAR), 5, 2); -- '08' ?
實(shí)用截取技巧
1. 提取文件名
SELECT SUBSTRING_INDEX('/path/to/file.txt', '/', -1); -- 'file.txt'
2. 郵箱域名提取
SELECT SUBSTRING_INDEX('user@example.com', '@', -1); -- 'example.com'
3. 安全截取URL參數(shù)
SET @url = 'https://example.com/page?param=value#section'; SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@url, '?', -1), '#', 1); -- 'param=value'
4. 中文字符安全截取
-- 創(chuàng)建多字節(jié)安全函數(shù) DELIMITER $$ CREATE FUNCTION mb_substr(str VARCHAR(255), start INT, len INT) RETURNS VARCHAR(255) DETERMINISTIC BEGIN RETURN CONVERT(SUBSTRING(str FROM start FOR len) USING utf8mb4); END$$ DELIMITER ; SELECT mb_substr('中國(guó)加油', 3, 2); -- '加油' ?
性能優(yōu)化方案
1.索引使用原則
-- 前綴索引創(chuàng)建 ALTER TABLE products ADD INDEX idx_name_prefix (product_name(10)); -- 有效查詢 SELECT * FROM products WHERE product_name LIKE 'Apple%'; -- 無效查詢(索引失效) SELECT * FROM products WHERE SUBSTRING(product_name, 1, 5) = 'Apple';
2.避免全表掃描
-- 優(yōu)化前(全表掃描) SELECT * FROM logs WHERE SUBSTRING(message, 10, 5) = 'ERROR'; -- 優(yōu)化后(使用虛擬列+索引) ALTER TABLE logs ADD COLUMN error_code VARCHAR(5) AS (SUBSTRING(message, 10, 5)) VIRTUAL; ALTER TABLE logs ADD INDEX idx_error_code (error_code);
3.內(nèi)存使用監(jiān)控
-- 監(jiān)控臨時(shí)表大小 SHOW VARIABLES LIKE 'tmp_table_size'; -- 默認(rèn)16MB SET tmp_table_size = 64*1024*1024; -- 增大臨時(shí)表內(nèi)存
函數(shù)對(duì)比表
函數(shù) | 特點(diǎn) | 適用場(chǎng)景 |
---|---|---|
SUBSTRING() | 靈活定位 | 任意位置截取 |
LEFT()/RIGHT() | 高效簡(jiǎn)單 | 首尾固定長(zhǎng)度截取 |
SUBSTRING_INDEX() | 分隔符處理 | 路徑/域名解析 |
MID() | SUBSTRING 別名 | 兼容舊代碼 |
最佳實(shí)踐總結(jié)
- 始終驗(yàn)證字符編碼:處理多語言數(shù)據(jù)前執(zhí)行
SHOW VARIABLES LIKE 'character_set%'
- 避免負(fù)位置與超長(zhǎng)參數(shù):明確業(yè)務(wù)需求邊界
- 大文本處理優(yōu)先考慮應(yīng)用層:減少數(shù)據(jù)庫壓力
- 創(chuàng)建計(jì)算列+索引:對(duì)頻繁截取字段優(yōu)化
- 重要數(shù)據(jù)先備份:執(zhí)行UPDATE前備份原字段
-- 安全更新示例 CREATE TABLE users_backup AS SELECT * FROM users; UPDATE users SET phone_area = SUBSTRING(phone, 1, 3);
總結(jié)
到此這篇關(guān)于MySQL字符串截取的核心要點(diǎn)和注意事項(xiàng)的文章就介紹到這了,更多相關(guān)MySQL字符串截取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫的一次死鎖實(shí)例分析
本文主要給大家通過一個(gè)實(shí)例來具體介紹MySQL死鎖問題的相關(guān)知識(shí),接下來我們就來一一介紹這部分內(nèi)容,希望能夠?qū)δ兴鶐椭?/div> 2016-11-11MySQL數(shù)據(jù)庫之事務(wù)簡(jiǎn)析
這篇文章主要介紹了MySQL數(shù)據(jù)庫之事務(wù)簡(jiǎn)析,MySQL數(shù)據(jù)庫中的事務(wù)是一組數(shù)據(jù)庫操作,它們被視為一個(gè)整體,要么全部執(zhí)行成功,要么全部失敗回滾,MySQL支持四種事務(wù)隔離級(jí)別,其中默認(rèn)的事務(wù)隔離級(jí)別是REPEATABLE?READ,需要的朋友可以參考下2023-09-09MySQL中的alter table命令的基本使用方法及提速優(yōu)化
這篇文章主要介紹了MySQL中的alter table命令的基本使用方法及提速優(yōu)化的方法,包括ALTER COLUMN的使用等等,需要的朋友可以參考下2015-11-11安裝Mysql5.7.10 winx64出現(xiàn)的幾個(gè)問題匯總
這篇文章主要介紹了安裝Mysql5.7.10 winx64出現(xiàn)的幾個(gè)問題匯總及解決方案,非常不錯(cuò),需要的朋友可以參考下2016-08-08MySQL中order?by排序時(shí)數(shù)據(jù)存在null則排序在最前面的方法
order by排序是最常用的功能,但是排序有時(shí)會(huì)遇到數(shù)據(jù)為空null的情況,這樣排序就會(huì)亂了,這篇文章主要給大家介紹了關(guān)于MySQL中order?by排序時(shí)數(shù)據(jù)存在null則排序在最前面的相關(guān)資料,需要的朋友可以參考下2024-06-06最新評(píng)論