执行以下命令时:
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
我得到了这个错误信息:
#1071 - Specified key was too long; max key length is 767 bytes
columnn1和column2的信息:
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
我认为varchar(20)只需要21个字节,而varchar(500)只需要501个字节。所以总字节数是522,小于767。为什么我得到了错误消息?
#1071 - Specified key was too long; max key length is 767 bytes
根据下面给出的列,这两个变量字符串列使用utf8_general_ci排序规则(隐含utf8字符集)。
在MySQL中,utf8字符集每个字符最多使用3个字节。因此,它需要分配500*3=1500字节,这比MySQL允许的767字节要大得多。这就是为什么您会得到1071错误。
换句话说,您需要基于字符集的字节表示来计算字符数,因为并非每个字符集都是一个字节表示(正如您所假设的那样)。例如,MySQL中的utf8每个字符最多使用3个字节,767/3≈255个字符,而对于utf8mb4,最多使用4个字节表示,767/4≈191个字符。
众所周知,MySQL
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
关于为什么你会得到错误消息的答案已经被很多用户回答了。我的答案是如何修复和使用它。
从这个链接中查阅。
打开MySQL客户端(或MariaDB客户端)。它是一个命令行工具。
它会问你的密码,输入正确的密码。
使用以下命令选择您的数据库:
数据库修改
设置全局innodb_large_prefix=on;
查询OK, 0行受影响(0.00秒)
set global innodb_file_format=Barracuda;
查询OK, 0行受影响(0.02秒)
去phpMyAdmin或类似的数据库,以便于管理。>选择数据库>查看表结构>进入“操作”页签。>将ROW_FORMAT更改为DYNAMIC并保存更改。
进入表的结构选项卡>单击唯一按钮。
完成了。现在应该没有错误了。
这个修复的问题是,如果你导出数据库到另一个服务器(例如从本地主机到真实主机),你不能在该服务器上使用MySQL命令行。你不能让它在那里工作。
对于这个问题,我自己的解决方案比降低表的VARCHAR大小更简单,也更安全。
情况:CentOS 7服务器运行Plesk Obsidian 18.0.37和MariaDB 5.5。我试图从运行MariaDB 10.1的服务器导入MySQL转储。
解决方案:从MariaDB 5.5升级到10.6。
这些步骤大致基于以下指南和以下指南:
mysqldump -u admin -p`cat /etc/psa/.psa.shadow` --all-databases --routines --triggers > /root/all-databases.sql
systemctl stop mariadb
cp -a /var/lib/mysql/ /var/lib/mysql_backup
Configure MariaDB repositories according to the official guide
Make sure you meet Plesk's minimum version requirements detailed here
yum install MariaDB-client MariaDB-server MariaDB-compat MariaDB-shared
systemctl start mariadb
In my case, the server failed to start here with an error: "Can't start server: Bind on TCP/IP port. Got error: 22: Invalid argument".
The fix was to replace bind-address as follows in /etc/my.cnf and re-run the command:
[mysqld]
# OLD (broken)
#bind-address = ::ffff:127.0.0.1
# NEW
bind-address = 127.0.0.1
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin
plesk sbin packagemng -sdf
rm -f /etc/init.d/mysql
systemctl daemon-reload