ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

来源:https://www.cnblogs.com/kerrycode/archive/2018/09/20/9680881.html
-Advertisement-
Play Games

今天在MySQL 5.6版本的資料庫中修改InnoDB表欄位長度時遇到了"ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes"錯誤,第一次遇到這個錯誤,遂花了點學習、研究過、總結這個問題。 我們先來創... ...


今天在MySQL 5.6版本的資料庫中修改InnoDB表欄位長度時遇到了"ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes"錯誤,第一次遇到這個錯誤,遂花了點學習、研究過、總結這個問題。

 

 

我們先來創建一個測試表,構造這樣的錯誤。

 

mysql> use MyDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> CREATE TABLE `TEST` (
    ->   `CODE_NAME` varchar(100) NOT NULL DEFAULT '',
    ->   `CODE_SEQ` smallint(6) NOT NULL DEFAULT '1',
    ->   `ACTIVE` char(1) DEFAULT 'Y',
    ->   `CODE_VALUE1` varchar(250) DEFAULT NULL,
    ->   PRIMARY KEY (`CODE_NAME`,`CODE_SEQ`),
    ->   KEY `IDX_GEN_CODE` (`CODE_NAME`,`CODE_VALUE1`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
 
 
mysql> ALTER TABLE TEST MODIFY CODE_VALUE1 VARCHAR(350);
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> 

 

   其實這個ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes錯誤是指超出索引位元組的限制,並不是指欄位長度限制。在官方文檔Limits on InnoDB Tables有關於這方面的介紹、描述(詳情請見參考資料):

 

 

MySQL 5.6文檔內容如下

 

 

By default, the index key prefix length limit is 767 bytes. See Section 13.1.13, “CREATE INDEX Syntax”. For example, you might hit this limit with a column prefix index of more than 255 characters on a TEXT or VARCHAR column, assuming a utf8mb3 character set and the maximum of 3 bytes for each character. When the innodb_large_prefix configuration option is enabled, the index key prefix length limit is raised to 3072 bytes for InnoDB tables that use DYNAMIC or COMPRESSED row format.

 

Attempting to use an index key prefix length that exceeds the limit returns an error. To avoid such errors in replication configurations, avoid enablinginnodb_large_prefix on the master if it cannot also be enabled on slaves.

The limits that apply to index key prefixes also apply to full-column index keys.

 

 

MySQL 5.7文檔內容如下

 

If innodb_large_prefix is enabled (the default), the index key prefix limit is 3072 bytes for InnoDB tables that use DYNAMIC or COMPRESSED row format. If innodb_large_prefix is disabled, the index key prefix limit is 767 bytes for tables of any row format.

innodb_large_prefix is deprecated and will be removed in a future release. innodb_large_prefix was introduced in MySQL 5.5 to disable large index key prefixes for compatibility with earlier versions of InnoDB that do not support large index key prefixes.

The index key prefix length limit is 767 bytes for InnoDB tables that use the REDUNDANT or COMPACT row format. For example, you might hit this limit with a column prefix index of more than 255 characters on a TEXT or VARCHAR column, assuming a utf8mb3 character set and the maximum of 3 bytes for each character.

Attempting to use an index key prefix length that exceeds the limit returns an error. To avoid such errors in replication configurations, avoid enablinginnodb_large_prefix on the master if it cannot also be enabled on slaves.

The limits that apply to index key prefixes also apply to full-column index keys.

 

 

如果啟用了系統變數innodb_large_prefix(預設啟用,註意實驗版本為MySQL  5.6.41,預設是關閉的,MySQL 5.7預設開啟),則對於使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引鍵首碼限製為3072位元組。如果禁用innodb_large_prefix,則對於任何行格式的表,索引鍵首碼限製為767位元組。

 

innodb_large_prefix將在以後的版本中刪除、棄用。在MySQL 5.5中引入了innodb_large_prefix,用來禁用大型首碼索引,以便與不支持大索引鍵首碼的早期版本的InnoDB相容。

對於使用REDUNDANT或COMPACT行格式的InnoDB表,索引鍵首碼長度限製為767位元組。例如,您可能會在TEXT或VARCHAR列上使用超過255個字元的列首碼索引達到此限制,假設為utf8mb3字元集,並且每個字元最多包含3個位元組。

 

嘗試使用超出限制的索引鍵首碼長度會返回錯誤。要避免複製配置中出現此類錯誤,請避免在主伺服器上啟用enableinnodb_large_prefix(如果無法在從伺服器上啟用)。

 

適用於索引鍵首碼的限制也適用於全列索引鍵。

 

 

註意:上面是767個位元組,而不是字元,具體到字元數量,這就跟字元集有關。GBK是雙位元組的,UTF-8是三位元組的

 

 

解決方案:

 

 

1:啟用系統變數innodb_large_prefix

 

註意:光有這個系統變數開啟是不夠的。必須滿足下麵幾個條件:

 

    1: 系統變數innodb_large_prefix為ON

    2: 系統變數innodb_file_format為Barracuda

    3: ROW_FORMAT為DYNAMIC或COMPRESSED

 

如下測試所示:

 

mysql> show variables like '%innodb_large_prefix%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | OFF   |
+---------------------+-------+
1 row in set (0.00 sec)
 
mysql> set global innodb_large_prefix=on;
Query OK, 0 rows affected (0.00 sec)
 
mysql> ALTER TABLE TEST MODIFY CODE_VALUE1 VARCHAR(350);
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
mysql> 
mysql> show variables like '%innodb_file_format%';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Antelope  |
| innodb_file_format_check | ON        |
| innodb_file_format_max   | Barracuda |
+--------------------------+-----------+
3 rows in set (0.01 sec)
 
mysql> set global innodb_file_format=Barracuda;
Query OK, 0 rows affected (0.00 sec)
 
mysql> ALTER TABLE TEST MODIFY CODE_VALUE1 VARCHAR(350);
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
mysql> 
 
mysql> 
mysql> show table status from MyDB where name='TEST'\G;
*************************** 1. row ***************************
           Name: TEST
         Engine: InnoDB
        Version: 10
     Row_format: Compact
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (1)LIMIT子句(MySql) LIMIT 子句用於規定要返回的記錄的數目,一般和Order By一起使用 經常用於數據的分頁查詢,但是一旦數據量一大,limit的性能就會急速下降 格式:select * from table limit m,n 其中m代表表的某一行數據,n表示的是要查找的多少 ...
  • [20180918]文件格式與sql_id.txt--//記錄測試中遇到的一個問題.這是我在探究SQL*Net more data from client遇到的問題.--//就是實際oracle會把windows的腳本文件轉化為linux的文本格式.1.環境:SCOTT@test01p> @ver1 ...
  • 過去公司都是用的5.7 系列的MySQL,隨著8.0的發版,也想試著升級一下。遇到了兩個小錯誤,記錄在此。 路徑設置: 安裝包路徑:/data/mysql80/ 數據路徑: /data/mysql/ 下麵描述一下,我安裝時遇到的錯誤 和 問題解決方案: 問題1 Premission denied 因 ...
  • 創建執行JS語句任務,在腳本中輸入相關代碼,兩種寫法: 寫法一 // 直接調用類的路徑 var now = com.haohe.utils.DateUtil.getNowDateTime(); //print("-->"+now); 寫法二 // 導入類的包路徑 importPackage(java ...
  • MongoDB 提供了 linux 各發行版本 64 位的安裝包,你可以在官網下載安裝包。 下載地址:https://www.mongodb.com/download-center#community 下麵我們選擇ubuntu來安裝MongoDB: 1.官網下載安裝包: wget http://fa ...
  • HIVE小結 HIVE基本語法 HIVE和Mysql十分類似 建表規則 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT tabl ...
  • 摘要: 下文將詳細講述sql server xml數據類型的相關知識,如下所示: 實驗環境: sql server 2008 R2 xml數據類型簡介: mssql sqlserver xml數據類型簡介 mssql sqlserver xml數據類型簡介 xml數據類型的生成方法: mssql s ...
  • 今天碰到一個問題,就是刪除資料庫數據,要刪除了有1000一千條左右的數據,總共數據大概有30萬條左右,但是如何刪除呢, 我首先想到的是找數據的共性,因為這些數據日期都是3月份的,30萬條數據時間段不相同,我就已時間為條件來刪除, 用到的語法是,找包含2018年3月為條件來刪除。月份的欄位是 publ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...