mysql索引過長Specialed key was too long的解決方法

在創建要給表的時候遇到一個有意思的問題,提示Specified key was too long; max key length is 767 bytes,從描述上來看,是Key太長,超過了指定的 767字節限制。通常出現在嘗試創建一個過長的唯一鍵(UNIQUE KEY)或主鍵(PRIMARY KEY)時。MySQL對于InnoDB存儲引擎有一個索引鍵長度的限制,這個限制基于字符集的不同而不同。

下面是產生問題的表結構

CREATE TABLE `test_table` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(1000) NOT NULL DEFAULT '',`link` varchar(1000) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

在使用utf8字符集時,每個字符可能占用3個字節,那么對于innodb表,索引鍵的最大長度大約為1000個字符左右(因為3072 / 3 ≈ 1024)。若字符集是utf8mb4,每個字符可能占用4個字節,所以最大長度會進一步減少到768個字符左右(3072 / 4 = 768

uf8mb4字符集:
要在 Mysql 中保存 4 字節長度的 UTF-8 字符,需要使用 utf8mb4 字符集(mb4就是most bytes 4的意思,專門用來兼容四字節的unicode),但只有 5.5.3 版本以后的才支持。
為了獲取更好的兼容性,應該總是使用 utf8mb4 而非 utf8. 對于 CHAR 類型數據,utf8mb4 會多消耗一些空間,根據 Mysql 官方建議,使用 VARCHAR 替代 CHAR。其實,utf8mb4是utf8的超集,理論上原來使用utf8,然后將字符集修改為utf8mb4,也會不會對已有的utf8編碼讀取產生任何問題。當然,為了節省空間一般情況下使用utf8也就夠了。

對于name,我們設置長度為1000可變字符,因為采用utf8mb4編碼, 所以它的大小就變成了 1000 * 4 > 767
所以再不修改其他配置的前提下,varchar的長度大小應該是 767 / 4 = 191
有興趣的同學可以測試下,分別指定name大小為191, 192時,是不是前面的可以創建表成功,后面的創建表失敗,并提示錯誤Specified key was too long; max key length is 767 bytes

解決辦法

使用innodb引擎

啟用innodb_large_prefix選項,修改約束擴展至3072字節
重新創建數據庫
my.cnf配置

set global innodb_large_prefix=on;
set global innodb_file_per_table=on;
set global innodb_file_format=BARRACUDA;
set global innodb_file_format_max=BARRACUDA;

上面這個3072字節的得出原因如下

我們知道InnoDB一個page的默認大小是16k。由于是Btree組織,要求葉子節點上一個page至少要包含兩條記錄(否則就退化鏈表了)。
所以一個記錄最多不能超過8k。又由于InnoDB的聚簇索引結構,一個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。
由于需要預留和輔助空間,扣掉后不能超過3500,取個“整數”就是(1024*3)。

在創建表的時候,加上 row_format=DYNAMIC

CREATE TABLE `test_table` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL DEFAULT '',`link` varchar(255) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=DYNAMIC;

這個參數的作用如下

MySQL 索引只支持767個字節,utf8mb4 每個字符占用4個字節,所以索引最大長度只能為191個字符,即varchar(191),若想要使用更大的字段,mysql需要設置成支持數據壓縮,并且修改表屬性 row_format ={DYNAMIC|COMPRESSED}

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

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

相關文章

Vue.js 實用技巧:深入理解 Vue.mixin

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 🍚 藍橋云課簽約作者、上架課程《Vue.js 和 E…

uniapp真機運行的時候顯示同步資源失敗,未得到同步資源的授權,請停止運行后重新運行,并注意手機上的授權提示

1、問題 在添加清單文件之前,項目運行都是好好的,添加了清單項目以后,基座一打就報這個錯,并且手機在安裝基座的時候會提示解析包時失敗, 2、解決方案 打開我的清單文件,我發現我和官網寫的清單文件不一…

華為OD機試“HJ2計算某字符出現次數”不區分大小寫Java編程解答

描述 寫出一個程序,接受一個由字母、數字和空格組成的字符串,和一個字符,然后輸出輸入字符串中該字符的出現次數。(不區分大小寫字母) 數據范圍: 1≤n≤1000 輸入描述: 第一行輸入一個由字…

【Linux進程間通信】共享內存

【Linux進程間通信】共享內存 目錄 【Linux進程間通信】共享內存system V共享內存共享內存示意圖共享內存的數據結構共享內存函數將共享內存掛接到對應的進程將共享內存取消掛接釋放共享內存 共享內存的特性共享內存擴展共享內存配合管道進行使用 作者:愛寫代碼的剛…

用docker部署后端項目

一、搭建局域網 1.1、介紹前后端項目搭建 需要4臺服務器,在同一個局域網中 1.2、操作 # 搭建net-ry局域網,用于部署若依項目 net-ry:名字 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1#查看 docker network ls…

Git 安全遠程訪問:SSH 密鑰對生成、添加和連接步驟解析

使用 SSH 密鑰對的 Git 安全遠程訪問:生成、添加和連接 SSH(Secure Shell)是一種用于安全遠程訪問的協議,它提供了加密通信和身份驗證機制。在使用 SSH 連接到遠程 Git 存儲庫時,您可以使用 SSH 密鑰對來確保安全性。…

3d模型合并后一片漆黑是什么原因,怎么解決---模大獅模型網

當合并多個3D模型后,發現整個合并后的模型顯示為一片漆黑通常是由以下幾個可能的原因導致的: 材質設置問題:合并后的模型可能存在材質設置錯誤,導致模型無法正確顯示。檢查每個模型的材質屬性,確保其正確設置&#xff…

老隋藍海項目有哪些?能賺錢嗎?

在創業的海洋中,每個人都渴望找到那片屬于自己的“藍海”,而“老隋藍海項目”便是許多人心中的那片未知海域。那么,老隋藍海項目究竟是指什么?它們又能否成為創業者的新財富之源? 藍海項目的定義 我們要明白,藍海項目通常指的是…

【漏洞復現】某廠商明御WEB應用防火墻任意用戶登錄漏洞

Nx01 產品簡介 安恒明御WEB應用防火墻(簡稱WAF)是杭州安恒信息技術股份有限公司自主研發的一款專業應用安全防護產品,專注于為網站、APP等Web業務系統提供安全防護。 Nx02 漏洞描述 安恒明御WEB應用防火墻report.php文件存在硬編碼設置的Con…

yolov7添加spd-conv注意力機制

一、spd-conv是什么? SPD-Conv(Symmetric Positive Definite Convolution)是一種新穎的卷積操作,它主要應用于處理對稱正定矩陣(SPD)數據。在傳統的卷積神經網絡(CNN)中,…

人工智能_大模型013_AIGC生成式模型的增強檢索_RAG知識補充檢索_補充私域和實時場景知識_關鍵字檢索增強---人工智能工作筆記0149

什么是RAG,RAG的意思就是,如果一套生成式AIGC大模型,你昨天訓練了以后,那么今天的知識,還沒有給他進行訓練,那么回答的時候,他就會遺漏今天的知識,那么我們就可以通過檢索的手段,把今天的知識,檢索出來,然后補充道prompt中,給這個大模型.讓他參考,這樣就包含了今天的知識相當于…

CY8C42(1.PSoC4 Pioneer Kit開箱及基本使用)

1.開箱 最近了解到賽普拉斯有一種芯片,屬于PSoC系列,與傳統MCU不同,有點類似跨界芯片,于是就買來玩玩了,老實說用完還是很特別的,因為我沒有用過FPGA,不確定是不是FPGA的開發流程(有…

怎樣理解vue2和vue3里的雙向數據綁定

在 Vue.js 中,雙向數據綁定意味著當數據變化時,視圖會自動更新;反之,當用戶通過視圖交互導致數據變化時,數據本身也會被更新。這種機制極大地簡化了用戶界面和數據之間的同步過程。 1. Vue2的實現 Vue2使用的是Objec…

MySQL的事務與隔離級別

1. 什么是事務? 數據庫中的事務是指對數據庫執行一批操作,而這些操作最終要么全部執行成功,要么全部失敗,不會存在部分成功的情況。這個時候就需要用到事務。 最經典的例子就是轉賬,你要給朋友小白轉 1000 塊錢&…

一代傳奇宗慶后:把員工寵成上帝

作者:積溪 琥珀酒研社快評: 梅子真是哭了 一代傳奇就此隕落 咱們又少了一個良心企業家 2月25日10時30分 娃哈哈集團創始人、董事長宗慶后 在杭州逝世,享年79歲 在過去一個多月的病危期間 他的病房里最顯眼的 不是呼吸機、檢測儀 而…

智慧城市中的公共服務創新:讓城市生活更便捷

目錄 一、引言 二、智慧城市公共服務創新的實踐 1、智慧交通系統 2、智慧醫療服務 3、智慧教育系統 4、智慧能源管理 三、智慧城市公共服務創新的挑戰 四、智慧城市公共服務創新的前景 五、結論 一、引言 隨著信息技術的迅猛發展,智慧城市已成為現代城市發…

技術總結: PPT繪圖

目錄 寫在前面參考文檔技巧總結PPT中元素的連接立方體調整厚度調整圖形中的文本3D 圖片調整漸變中的顏色 寫在前面 能繪制好一個好看的示意圖非常重要, 在科研和工作中好的示意圖能精準表達出自己的想法, 減少溝通的成本, 可視化的呈現也可以加強自身對系統的理解, 時間很久后…

分分鐘搞定JSON解析

json 庫能夠解析字符串或文本中的 JSON 內容。 該庫將 JSON 解析為 Python 字典或列表,也能將 Python 字典或列表轉換為 JSON 字符串。 解析 JSON 如下的 JSON 格式的字符串: json_string {"first_name": "Guido", "last_na…

【Web】速談FastJson反序列化中TemplatesImpl的利用

目錄 簡要原理分析 exp 前文:【Web】關于FastJson反序列化開始前的那些前置知識 簡要原理分析 眾所周知TemplatesImpl的利用鏈是這樣的: TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> TemplatesImpl#getTransl…

瑞芯微RK3588 C++部署Yolov8檢測和分割模型

最近這一個月在研究國產瑞芯微板子上部署yolov8的檢測和分割模型,踩了很多坑,記錄一下部署的過程和遇到的一些問題: 1 環境搭建 需要的環境和代碼主要包括: (1)rknn-toolkit2-1.5.2:工具鏈&am…