Mysql
MariaDB 10.1.38 - 指定的密鑰太長;最大密鑰長度為 767 字節
我有一個有 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
創建之前優化您的 breunique keys
:這裡