在 MySQL 中 varchar 大小之间是否存在性能差异?例如,varchar(25)和varchar(64000)。如果没有,是否有理由不声明所有具有最大大小的 varchars 以确保您不会用完空间?
我经常遇到列是varchar(255),所以大概这是各种约定。255 是 2^8 - 1。那么 2^n - 1 的长度有什么“神奇”之处吗?或者只是专门255?某些特定varchar长度是否有性能或存储优化优势?或者这只是不再适用于当前版本的 MariaDB 和 MySQL 的旧智慧?
我有一个包含 3 列的表:
id(int 11) | user_id(int 4) | title(varchar 512)
____________|________________|___________________
1 | 3 | Thing X
2 | 3 | Something Else
3 | 5 | Thing X
Run Code Online (Sandbox Code Playgroud)
我需要在user_id和之间进行独特的组合title。为此,我正在使用这个简单的查询:
ALTER TABLE posts ADD UNIQUE `unique_post`(`user_id`, `title`)
Run Code Online (Sandbox Code Playgroud)
该title列的字符集是utf8mb4_unicode_ci. 数据库是使用字符集创建的utf8mb4:
CREATE DATABASE learning_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
表类型是InnoDB.
我试图设置一些全局变量:
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=on;
SET GLOBAL innodb_large_prefix=on;
Run Code Online (Sandbox Code Playgroud)
但我遇到了同样的错误1071:
Specified key was too long; max …Run Code Online (Sandbox Code Playgroud) 我们的服务器正在创建很多表,其中之一就是表Lock_。
我们在 Percona 上使用 MySQL 5.5。我们还使用utf8_general_ci和utf8。
在表上创建以下索引时会抛出以下错误Lock_:
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Run Code Online (Sandbox Code Playgroud)
这是创建表查询:
create table Lock_ (
uuid_ VARCHAR(75) null,
lockId LONG not null primary key,
companyId LONG,
userId LONG,
userName VARCHAR(75) null,
createDate DATE null,
className VARCHAR(75) null,
key_ VARCHAR(200) null,
owner VARCHAR(255) null,
inheritable BOOLEAN,
expirationDate DATE null
);
Run Code Online (Sandbox Code Playgroud)
索引查询:
create unique index IX_DD635956 on Lock_ (className, key_, owner);
Run Code Online (Sandbox Code Playgroud)
这个问题发生在我们的一台产品服务器上(之前是独立的 mysql,后来转移到 …