在使用mysql的时候经常遇到各种问题,之前都是每次遇到查询一下网上的解决方案解决掉,但是下次再遇到还是记不住,需要重新百度解决,今天又遇到了一个问题,顺便记录下来方便以后查阅,这篇文章会不断进行更新,记录我使用mysql过程中遇到的问题,各位小伙伴如果有遇到奇怪的问题,欢迎留言,我一起整理一下,方便大家查阅,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
目录
Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘
问题一
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 或者 Index column size too large. The maximum column size is 767 bytes
场景
我的建表语句是这样的:
CREATE TABLE `xxl_job_registry` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`registry_group` VARCHAR(50) NOT NULL,
`registry_key` VARCHAR(255) NOT NULL,
`registry_value` VARCHAR(255) NOT NULL,
`update_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i_g_k_v` (`registry_key`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
问题一的错误意思就是索引字段长度太长,超过了767bytes。看了下我建表索引字段为VARCHAR(255),看起来没啥毛病,之前都是这么用的,为什么会报错呢?看下面:
原因
mysql的索引只支持不超过767个字节或者768/2=384个双字节 或者767/3=255个三字节的字段 而GBK是双字节的,UTF8是三字节的。utf8mb4专门用来兼容四字节的unicode(每个字符最大的字节数为4)所以很明显 4*255 > 767,所以会报超长的错误。
解决
你可以降低一下字段的字符长度别超了767即可,比如使用VARCHAR(100),如果非要使用VARCHAR(255),那就看下面的解决方式:修改InnoDB的innodb_large_prefix,innodb_file_format参数。
-- 查看原值
SHOW VARIABLES LIKE 'innodb_large_prefix';
SHOW VARIABLES LIKE 'innodb_file_format';
-- 修改参数值
SET GLOBAL innodb_large_prefix=1;
SET GLOBAL innodb_file_format=BARRACUDA;
然后在建表的时候指定表的row_format为dynamic或者compressed。改为如下:
CREATE TABLE `xxl_job_registry` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`registry_group` VARCHAR(50) NOT NULL,
`registry_key` VARCHAR(255) NOT NULL,
`registry_value` VARCHAR(255) NOT NULL,
`update_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i_g_k_v` (`registry_key`)
)ROW_FORMAT=DYNAMIC ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
如果不指定row_format会报第二个错误:Index column size too large. The maximum column size is 767 bytes。
问题二
Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘
查看下my.cnf,对于windows系统查看my.ini文件:
可以看到socket位置在/tmp/mysql.sock,不在/var/lib/mysql/mysql.soc
解决办法
方式一:用软链接。
添加软连语法:
-- ln -s 源文件名称 软链接文件名称
sudo ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
方式二:修改配置文件。
在 /var/lib/ 目录下创建 mysql 文件夹。
sudo mkdir mysql