mysql最长字节长度,MySQL VARCHAR(255)UTF8对于密钥而言太长,但最大长度为1000个字节...

I know there have been plenty of questions about this, but I think my math is right.

MySQL reserves 3 bytes per UTF8 character.

MyISAM allows keys of length 1000 bytes.

My UTF8 VARCHAR(255) should be 255 * 3 = 765 bytes

Unless UNQUE requires an extra 200+ bytes per entry, why doesn't this work?

mysql> ALTER TABLE entry ADD UNIQUE INDEX (name(255));

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

Is there anything I can do about this?

EDIT:

It turns out the limit is 250. It seems chars count as 4 bytes for unique indices, but I don't know why.

EDIT 2:

Thanks Vladislav Vaintroub, the charset is indeed utf8mb4. That solves the mystery. I hadn't seen any documentation on this change.

I'm guessing it builds the non unique index by implicitly truncating the field, which is unacceptable for unique indices so it refuses.

If you re-enter your comment as an answer I'd be happy to accept it.

Solution: Specify utf8, not utf8mb4 (MySQL Admin doesn't allow this, so create the table manually)

解决方案

If you're using utf8mb4, and you have unique indexes on varchar columns that are greater than 191 characters in length, you'll need to turn on innodb_large_prefix to allow for larger columns in indexes, because utf8mb4 requires more storage space than utf8 or latin1. Add the following to your my.cnf file.

[mysqld]

innodb_file_format=barracuda

innodb_file_per_table=1

innodb_large_prefix=1

init_connect='SET collation_connection = utf8mb4_unicode_ci'

init_connect='SET NAMES utf8mb4'

character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci

More info about the why and future from MySQL 5.7 documentation:

If innodb_large_prefix is enabled (the default in MySQL 5.7.7), 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 in MySQL 5.7.7 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.

To sum up, the limit is only there for compatibility and will be increased in future versions.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值