Mysql

MariaDB 10.1.38 - 指定的密鑰太長;最大密鑰長度為 767 字節

  • May 12, 2020

我有一個有 3 列的表:

id(int 11)  | user_id(int 4) | title(varchar 512) 
____________|________________|___________________
    1      |        3       | Thing X
    2      |        3       | Something Else
    3      |        5       | Thing X

我需要在user_id和之間做出獨特的組合title。為此,我正在使用這個簡單的查詢:

ALTER TABLE posts ADD UNIQUE `unique_post`(`user_id`, `title`)

title列的字元集是utf8mb4_unicode_ci. 數據庫是使用 charset 創建的utf8mb4

CREATE DATABASE learning_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

並且表類型是InnoDB.

我試圖設置一些全域變數:

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=on;
SET GLOBAL innodb_large_prefix=on;

但我得到了同樣的錯誤1071

Specified key was too long; max key length is 767 bytes

還有什麼我可以做的嗎?

PS:如果我只設置索引的第一個191字元,title我不會得到那個錯誤:

ALTER TABLE posts ADD UNIQUE `unique_post`(`user_id`, `title`(191))

…但我有與同一使用者相關的標題,可能僅在最後一個字母處有所不同(考慮到我的字元集,也就是最後 4 個字節)

PSS:我在本地主機上(使用 xampp)。

好的,經過一個週末的研究,答案非常簡單,我將把它留在這裡,以供其他面臨同樣問題的人使用。

這個答案在 MariaDB 10.1.38、db charset utf8mb4、table typeInnoDB和 table charset上進行了測試utf8mb4_unicode_ci

打開my.ini並添加此行(如果它們已經存在,則在之後編輯所有內容=

$$ mysqld $$:

innodb_file_format = Barracuda
innodb_file_per_table = on
innodb_default_row_format = dynamic
innodb_large_prefix = 1
innodb_file_format_max = Barracuda

您還可以通過 cmd/終端設置它們:

在 Windows 上 - 如果您的 XAMPP 位於c:\xampp\

打開一個 cmd 並導航到mysql’s bin - 在這種情況下:

cd c:\xampp\mysql\bin

認證:

mysql -h localhost -u root

一旦您通過身份驗證執行此查詢(一次一個):

SET GLOBAL innodb_file_format = Barracuda;
SET GLOBAL innodb_file_per_table = on;
SET GLOBAL innodb_default_row_format = dynamic;
SET GLOBAL innodb_large_prefix = 1;
SET GLOBAL innodb_file_format_max = Barracuda;

但我建議堅持編輯 my.ini(或 .cnf),因為如果您要查詢,您的選項可能會在每次重新啟動 Apache 時重寫。

您可以閱讀有關InnoDB儲存格式的更多資訊:這裡

此外,這篇文章非常有趣,可以幫助您在varchars創建之前優化您的 bre unique keys這裡

引用自:https://dba.stackexchange.com/questions/231219