欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql之索引長(zhǎng)度限制方式

 更新時(shí)間:2024年01月29日 08:32:35   作者:magic_kid_2010  
這篇文章主要介紹了Mysql之索引長(zhǎng)度限制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mysql索引長(zhǎng)度限制

在設(shè)置 utf8mb4 字段的字符長(zhǎng)度時(shí),可能會(huì)拋出一個(gè)異常:

"Specified key was too long; max key length is 1000 bytes"

也就是在給表的索引字段添加字符長(zhǎng)度時(shí),超過(guò)了最大索引長(zhǎng)度 1000 字節(jié)。

一、原因分析

關(guān)于索引長(zhǎng)度的限制,最主要的因素就是存儲(chǔ)引擎和字符集。

字符集的影響在于,不同的字符集,單個(gè)字符包含的最大字節(jié)數(shù)有所不同。

比如 utf8 字符集,一個(gè)字符最多包含 3 個(gè)字節(jié)。而 utf8mb4 一個(gè)字符最多包含 4 個(gè)字節(jié)。

對(duì)于 InnoDB 引擎來(lái)說(shuō):

1) Mysql 版本 <=5.7.6

  • 如果是單字段索引,則字段長(zhǎng)度不應(yīng)超過(guò) 767 字節(jié)。
  • 如果是聯(lián)合索引,則每個(gè)字段長(zhǎng)度都不應(yīng)超過(guò) 767 字節(jié),且所有字段長(zhǎng)度合計(jì)不應(yīng)超過(guò) 3072 字節(jié)。

這種情況下,常見(jiàn)字符集和引擎組合后的字符長(zhǎng)度限制如下:

InnoDB最大字節(jié)數(shù)單字段索引最大字符數(shù)聯(lián)合索引合計(jì)最大字符數(shù)
lantin117673072
gbk23831536
utf832551024
utf8mb44191768

2) Mysql 版本 >=5.7.7

在該版本情況下,由于 InnoDB 引擎的 innodb_large_prefix 等選項(xiàng)默認(rèn)值改變,單字段索引長(zhǎng)度限制增大。

  • 如果是單字段索引,則字段長(zhǎng)度不應(yīng)超過(guò) 3072 字節(jié)。
  • 如果是聯(lián)合索引,則每個(gè)字段長(zhǎng)度都不應(yīng)超過(guò) 3072 字節(jié),且所有字段長(zhǎng)度合計(jì)不應(yīng)超過(guò) 3072 字節(jié)。

這種情況下,常見(jiàn)字符集和引擎組合后的字符長(zhǎng)度限制如下:

InnoDB最大字節(jié)數(shù)單字段索引最大字符數(shù)聯(lián)合索引合計(jì)最大字符數(shù)
lantin1130723072
gbk215361536
utf8310241024
utf8mb44768768

對(duì)于 MyISAN 引擎來(lái)說(shuō):

如果 Mysql 版本 <=5.5.4 則其默認(rèn)存儲(chǔ)引擎為 MyISAN。

  • 如果是單字段索引,則字段長(zhǎng)度不應(yīng)超過(guò) 1000 字節(jié)。
  • 如果是聯(lián)合索引,則每個(gè)字段長(zhǎng)度都不應(yīng)超過(guò) 1000 字節(jié),且所有字段長(zhǎng)度合計(jì)不應(yīng)超過(guò) 1000 字節(jié)。

這種情況下,常見(jiàn)字符集和引擎組合后的字符長(zhǎng)度限制如下:

MyISAM最大字節(jié)數(shù)單字段索引最大字符數(shù)多字段索引合計(jì)最大字符數(shù)
lantin1110001000
gbk2500500
utf83333333
utf8mb44250250

二、解決方法

(1)修改存儲(chǔ)引擎

(2)修改字符集

(3)修改索引字段的字符長(zhǎng)度

在 Mysql 版本 <=5.7.6 且字符集為 utf8mb4 的情況下,設(shè)置需要添加索引的字段長(zhǎng)度為 191。

(4)在 Mysql<=5.7.6 的情況,修改 InnoDB 選項(xiàng),將單字段索引長(zhǎng)度限制由 767 字節(jié)(bytes)提高到 3072 字節(jié)。

先查看當(dāng)前默認(rèn)選項(xiàng)值:

SHOW VARIABLES LIKE 'innodb_large_prefix';
SHOW VARIABLES LIKE 'innodb_file_per_table';
SHOW VARIABLES LIKE 'innodb_file_format';

確認(rèn)選項(xiàng)值是否是:

innodb_large_prefix=ON
innodb_file_per_table=ON
innodb_file_format=Barracuda

如果不是,進(jìn)行相應(yīng)的修改:

SET GLOBAL innodb_large_prefix = 1;
SET GLOBAL innodb_file_per_table = 1;
SET GLOBAL innodb_file_format = barracuda;

上面兩項(xiàng)的值設(shè)置為 1 而不是 ON,是因?yàn)樵?Mysql5.6 之前,布爾值的變量還無(wú)法識(shí)別 ON 或者 OFF,只能是數(shù)字 1 或者 0。

并且,在創(chuàng)建新表時(shí)還要指定 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED。

如:

CREATE TABLE `test` (
`a` varchar(767),
`b` varchar(1),
`c` varchar(200),
`d` varchar(168),
`e` varchar(5),
KEY `a_index` (`a`,`b`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

或修改當(dāng)前表:

ALTER TABLE [...], ROW_FORMAT=DYNAMIC;

(5)在創(chuàng)建索引時(shí)限制字段上的前綴索引長(zhǎng)度:

CREATE TABLE `test` (
`a` varchar(767),
`b` varchar(1),
`c` varchar(200),
`d` varchar(168),
`e` varchar(5),
KEY `a_index` (`a`(191),`b`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql?自增長(zhǎng)約束(auto_increment)的使用

    mysql?自增長(zhǎng)約束(auto_increment)的使用

    MySQL中的自增長(zhǎng)約束(auto_increment)用于自動(dòng)為表的主鍵字段生成唯一的遞增值,通過(guò)設(shè)置該屬性,可以簡(jiǎn)化主鍵的管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • MySQL 5.7.17 免安裝版本的安裝配置

    MySQL 5.7.17 免安裝版本的安裝配置

    這篇文章主要為大家詳細(xì)介紹了MySQL 5.7.17 免安裝版本的安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 為什么mysql字段要使用NOT NULL

    為什么mysql字段要使用NOT NULL

    數(shù)據(jù)庫(kù)字段一定要設(shè)置為 not null,不然會(huì)有很大的bug,下面就一起來(lái)介紹一下,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 初步介紹MySQL中的集合操作

    初步介紹MySQL中的集合操作

    這篇文章主要介紹了初步的MySQL中的集合操作,即UNION DISTINCT和UNION ALL兩個(gè)命令,需要的朋友可以參考下
    2015-04-04
  • MySQL中根據(jù)出生日期計(jì)算年齡兩種方法

    MySQL中根據(jù)出生日期計(jì)算年齡兩種方法

    使用SQL語(yǔ)句計(jì)算年齡,在事務(wù)處理和日期計(jì)算中,較為常見(jiàn),下面這篇文章主要給大家介紹了關(guān)于MySQL中根據(jù)出生日期計(jì)算年齡的兩種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 詳解MySql中InnoDB存儲(chǔ)引擎中的各種鎖

    詳解MySql中InnoDB存儲(chǔ)引擎中的各種鎖

    本文主要介紹了詳解MySql中InnoDB存儲(chǔ)引擎中的各種鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • mysql通過(guò)查看跟蹤日志跟蹤執(zhí)行的sql語(yǔ)句

    mysql通過(guò)查看跟蹤日志跟蹤執(zhí)行的sql語(yǔ)句

    在SQL SERVER下跟蹤sql采用事件探查器,而在mysql下如何跟蹤sql呢,下面有個(gè)不錯(cuò)的方法,大家可以參考下
    2014-01-01
  • MYSQL輸入密碼后閃退現(xiàn)象的解決方法

    MYSQL輸入密碼后閃退現(xiàn)象的解決方法

    最近在啟動(dòng)MySQL服務(wù)端并輸入密后,出現(xiàn)閃退現(xiàn)象,實(shí)際上這種問(wèn)題很常見(jiàn),下面這篇文章主要給大家介紹了關(guān)于MYSQL輸入密碼后閃退現(xiàn)象的解決方法,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • MySQL無(wú)法存儲(chǔ)emoji表情解決方案分析

    MySQL無(wú)法存儲(chǔ)emoji表情解決方案分析

    這篇文章主要介紹了MySQL無(wú)法存儲(chǔ)emoji表情解決方案,結(jié)合實(shí)例形式分析了Python爬蟲(chóng)爬取文章中emoji表情存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,涉及mysql utf8mb4編碼的修改相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • 使用Canal和Kafka解決MySQL與緩存的數(shù)據(jù)一致性問(wèn)題

    使用Canal和Kafka解決MySQL與緩存的數(shù)據(jù)一致性問(wèn)題

    這篇文章主要介紹了使用Canal和Kafka解決MySQL與緩存的數(shù)據(jù)一致性問(wèn)題,文中通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07

最新評(píng)論