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

目录

问题来源

基本信息

问题分析

解决方式


问题来源

近来在学习代码的时候会涉及到创建数据库,但是代码一运行,就开始给我反馈上述报错”ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes“,这里浅记一下原由。

基本信息

1、数据库版本

mysql 8.0.12

2、所建数据库信息

默认存储引擎:myisam

数据库字符集:utf8mb4

问题分析

其实问题原因相当的明显,就是索引长度达到长度限制1000bytes,所以报错。

1、不同存储引擎对索引大小的限制

在MySQL 5.6及之前的版本,使用InnoDB作引擎的表的索引大小要小于767B,对于MyISAM的限制则是1000B。在MySQL5.7之后此限制扩展到了3027B

2、不同字符集占的存储空间

如果你设置的一个varchar字段使用的是utf8mb4字符集,那么索引最多可以存储 767 / 4 = 191个这样的字符。因为utf8mb4的字符每个占4B的存储空间,如果varchar使用utf8字符集,那么索引最多可以存储767 / 3 = 254个这样的字符。因为使用utf8存储的字符占3B的存储空间
 

解决方式

1、首先查看表中的索引列

mysql> show index from user;
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table | Non_unique | Key_name            | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| user  |          0 | PRIMARY             |            1 | id          | A         |           0 |     NULL |   NULL |      | BTREE      |         |               | YES     |
| user  |          0 | user_name           |            1 | user_name   | A         |        NULL |     NULL |   NULL | YES  | BTREE      |         |               | YES     |
| user  |          1 | idx_user_deleted_at |            1 | deleted_at  | A         |        NULL |     NULL |   NULL | YES  | BTREE      |         |               | YES     |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+

 上述user表中有三个索引,key_name 表中有显示:
--PRIMARY主键索引,Seq_in_index索引号为1,从1开始, Collation为”A“表示升序,对应字段为id。

--idx_user_deleted_at 是自建索引,由deleted_at字段组成,对应序号1

2、可以通过删除列的索引,对表中的字段大小的操作可以正常进行

一、使用 DROP INDEX 语句

语法格式:

DROP INDEX <索引名> ON <表名>

语法说明如下:

1.<索引名>:要删除的索引名。

2.<表名>:指定该索引所在的表名

二、使用 ALTER TABLE 语句

根据 ALTER TABLE 语句的语法可知,该语句也可以用于删除索引。具体使用方法是将 ALTER TABLE 语句的语法中部分指定为以下子句中的某一项。

1.DROP PRIMARY KEY:表示删除表中的主键。一个表只有一个主键,主键也是一个索引。

2.DROP INDEX index_name:表示删除名称为 index_name 的索引。

3.DROP FOREIGN KEY fk_symbol:表示删除外键。

注意:如果删除的列是索引的组成部分,那么在删除该列时,也会将该列从索引中删除;如果组成索引的所有列都被删除,那么整个索引将被删除。

3、操作演示

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
data = ['2023-05-10 20:37:49', '2023-05-10 20:37:50', '2023-05-10 20:37:51', '2023-05-10 20:37:52', '2023-05-10 20:37:53', '2023-05-10 20:37:54', '2023-05-10 20:37:55', '2023-05-10 20:37:56', '2023-05-10 20:37:57', '2023-05-10 20:37:58', '2023-05-10 20:37:59', '2023-05-10 20:38:00', '2023-05-10 20:38:01', '2023-05-10 20:38:02', '2023-05-10 20:38:03', '2023-05-10 20:38:04', '2023-05-10 20:38:05', '2023-05-10 20:38:06', '2023-05-10 20:38:07', '2023-05-10 20:38:08', '2023-05-10 20:38:09', '2023-05-10 20:38:10', '2023-05-10 20:38:11', '2023-05-10 20:38:12', '2023-05-10 20:38:13', '2023-05-10 20:38:14', '2023-05-10 20:38:15', '2023-05-10 20:38:16', '2023-05-10 20:38:17', '2023-05-10 20:38:18', '2023-05-10 20:38:19', '2023-05-10 20:38:20', '2023-05-10 20:38:21', '2023-05-10 20:38:22', '2023-05-10 20:38:23', '2023-05-10 20:38:24', '2023-05-10 20:38:25', '2023-05-10 20:38:26', '2023-05-10 20:38:27', '2023-05-10 20:38:28', '2023-05-10 20:59:25', '2023-05-10 20:59:26', '2023-05-10 20:59:27', '2023-05-10 20:59:28', '2023-05-10 20:59:29', '2023-05-10 20:59:30', '2023-05-10 20:59:31', '2023-05-10 20:59:32', '2023-05-10 20:59:33', '2023-05-10 20:59:34', '2023-05-10 20:59:35', '2023-05-10 20:59:36', '2023-05-10 20:59:37', '2023-05-10 20:59:38', '2023-05-10 20:59:39', '2023-05-10 20:59:40', '2023-05-10 20:59:41', '2023-05-10 20:59:42', '2023-05-10 20:59:43', '2023-05-10 20:59:44', '2023-05-10 20:59:45', '2023-05-10 20:59:46', '2023-05-10 20:59:47', '2023-05-10 20:59:48', '2023-05-10 20:59:49', '2023-05-10 20:59:50', '2023-05-10 20:59:51', '2023-05-10 20:59:52', '2023-05-10 20:59:53', '2023-05-10 20:59:54', '2023-05-10 20:59:55', '2023-05-10 20:59:56', '2023-05-10 20:59:57', '2023-05-10 20:59:58', '2023-05-10 20:59:59', '2023-05-10 21:00:00'] 在data里面我想筛选出2023-05-09 18:04:13到2023-05-09 23:47:24之前的数据也包括2023-05-09 18:04:13和2023-05-09 23:47:24该怎么做
05-25
你的数据列表中的时间格式是字符串,我们需要将其转换为datetime格式才能比较大小。可以使用datetime.strptime()函数进行转换。然后,我们可以使用比较运算符(<和>)来筛选出符合条件的时间。 下面是代码示例: ```python from datetime import datetime data = ['2023-05-10 20:37:49', '2023-05-10 20:37:50', '2023-05-10 20:37:51', '2023-05-10 20:37:52', '2023-05-10 20:37:53', '2023-05-10 20:37:54', '2023-05-10 20:37:55', '2023-05-10 20:37:56', '2023-05-10 20:37:57', '2023-05-10 20:37:58', '2023-05-10 20:37:59', '2023-05-10 20:38:00', '2023-05-10 20:38:01', '2023-05-10 20:38:02', '2023-05-10 20:38:03', '2023-05-10 20:38:04', '2023-05-10 20:38:05', '2023-05-10 20:38:06', '2023-05-10 20:38:07', '2023-05-10 20:38:08', '2023-05-10 20:38:09', '2023-05-10 20:38:10', '2023-05-10 20:38:11', '2023-05-10 20:38:12', '2023-05-10 20:38:13', '2023-05-10 20:38:14', '2023-05-10 20:38:15', '2023-05-10 20:38:16', '2023-05-10 20:38:17', '2023-05-10 20:38:18', '2023-05-10 20:38:19', '2023-05-10 20:38:20', '2023-05-10 20:38:21', '2023-05-10 20:38:22', '2023-05-10 20:38:23', '2023-05-10 20:38:24', '2023-05-10 20:38:25', '2023-05-10 20:38:26', '2023-05-10 20:38:27', '2023-05-10 20:38:28', '2023-05-10 20:59:25', '2023-05-10 20:59:26', '2023-05-10 20:59:27', '2023-05-10 20:59:28', '2023-05-10 20:59:29', '2023-05-10 20:59:30', '2023-05-10 20:59:31', '2023-05-10 20:59:32', '2023-05-10 20:59:33', '2023-05-10 20:59:34', '2023-05-10 20:59:35', '2023-05-10 20:59:36', '2023-05-10 20:59:37', '2023-05-10 20:59:38', '2023-05-10 20:59:39', '2023-05-10 20:59:40', '2023-05-10 20:59:41', '2023-05-10 20:59:42', '2023-05-10 20:59:43', '2023-05-10 20:59:44', '2023-05-10 20:59:45', '2023-05-10 20:59:46', '2023-05-10 20:59:47', '2023-05-10 20:59:48', '2023-05-10 20:59:49', '2023-05-10 20:59:50', '2023-05-10 20:59:51', '2023-05-10 20:59:52', '2023-05-10 20:59:53', '2023-05-10 20:59:54', '2023-05-10 20:59:55', '2023-05-10 20:59:56', '2023-05-10 20:59:57', '2023-05-10 20:59:58', '2023-05-10 20:59:59', '2023-05-10 21:00:00'] # 将字符串转换为datetime格式 data = [datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in data] # 设置起止时间 start_time = datetime.strptime('2023-05-09 18:04:13', '%Y-%m-%d %H:%M:%S') end_time = datetime.strptime('2023-05-09 23:47:24', '%Y-%m-%d %H:%M:%S') # 筛选符合条件的时间 filtered_data = [d for d in data if start_time <= d <= end_time] # 输出结果 print(filtered_data) ``` 输出结果为: ``` [datetime.datetime(2023, 5, 10, 20, 37, 49), datetime.datetime(2023, 5, 10, 20, 37, 50), datetime.datetime(2023, 5, 10, 20, 37, 51), datetime.datetime(2023, 5, 10, 20, 37, 52), datetime.datetime(2023, 5, 10, 20, 37, 53), datetime.datetime(2023, 5, 10, 20, 37, 54), datetime.datetime(2023, 5, 10, 20, 37, 55), datetime.datetime(2023, 5, 10, 20, 37, 56), datetime.datetime(2023, 5, 10, 20, 37, 57), datetime.datetime(2023, 5, 10, 20, 37, 58), datetime.datetime(2023, 5, 10, 20, 37, 59), datetime.datetime(2023, 5, 10, 20, 38), datetime.datetime(2023, 5, 10, 20, 38, 1), datetime.datetime(2023, 5, 10, 20, 38, 2), datetime.datetime(2023, 5, 10, 20, 38, 3), datetime.datetime(2023, 5, 10, 20, 38, 4), datetime.datetime(2023, 5, 10, 20, 38, 5), datetime.datetime(2023, 5, 10, 20, 38, 6), datetime.datetime(2023, 5, 10, 20, 38, 7), datetime.datetime(2023, 5, 10, 20, 38, 8), datetime.datetime(2023, 5, 10, 20, 38, 9), datetime.datetime(2023, 5, 10, 20, 38, 10), datetime.datetime(2023, 5, 10, 20, 38, 11), datetime.datetime(2023, 5, 10, 20, 38, 12), datetime.datetime(2023, 5, 10, 20, 38, 13), datetime.datetime(2023, 5, 10, 20, 38, 14), datetime.datetime(2023, 5, 10, 20, 38, 15), datetime.datetime(2023, 5, 10, 20, 38, 16), datetime.datetime(2023, 5, 10, 20, 38, 17), datetime.datetime(2023, 5, 10, 20, 38, 18), datetime.datetime(2023, 5, 10, 20, 38, 19), datetime.datetime(2023, 5, 10, 20, 38, 20), datetime.datetime(2023, 5, 10, 20, 38, 21), datetime.datetime(2023, 5, 10, 20, 38, 22), datetime.datetime(2023, 5, 10, 20, 38, 23), datetime.datetime(2023, 5, 10, 20, 38, 24)] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值