最近做了一个简单的短链接服务,短链接使用自增 id 转化为 62 进制(10 个数字+26个小写字母+26个大写字母),但是发现插入数据库报了索引插入重复。
创建测试表
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`short_url` varchar(255) NOT NULL COMMENT '测试',
PRIMARY KEY (`id`),
UNIQUE KEY `short_url` (`short_url`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试表';
插入数据
mysql> insert into test(`short_url`) values('ff');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test(`short_url`) values('fF');
ERROR 1062 (23000): Duplicate entry 'fF' for key 'short_url'
如上报了重复的 key 插入,这是因为我们上面创建的表的编码是 utf8mb4_unicode_ci,而 utf8mb4_unicode_ci 编码比较是不区分大小写的,所以我们需要一个区分大小写的编码,那就是 utf8mb4_bin。
修改字段编码
mysql> alter table test modify `short_url` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '测试';
Query OK, 1 row affected (0.12 sec)
Records: 1 Duplicates: 0 Warnings: 0
测试数据插入
mysql> insert into test(`short_url`) values('Ff');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test(`short_url`) values('FF');
Query OK, 1 row affected (0.00 sec)
如上大小写已区分。
非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
show processlist show processlist 用来查看 MySQL 正在运行的线程,如果使用 root 账号可以看到所有用户的线程或者只能看到所使用账号自己的线程,当然如果该用户被赋予了 Process 权限也是可以查看所有用户的线程的。 命令使用展示: mysql> show processlist; +-----+------+-----------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | S
常见的数据库主要分为三类,SQL(关系型数据库)、NoSQL(非关系型数据库)、NewSQL。 SQL SQL即关系型数据库(RDBMS — Relational Database Management System),SQL 是基于关系型数据模型设计的数据库,SQL用二维表格表示实体以及实体之间的关系,对数据的操作也几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分组、合并、连接、选取等运算来实现数据库的管理。 常见的关系型数据库有: Orcale MySQL Microsoft SQL server PostgreSQL SQLLite MariaDB 关系型数据库特点 事务性
事情起因 有个同事需要一个管理系统,需要管理一些图片什么的,我就想着让他用我写的这套系统,然后就想着把代码和库复制一份出来给他用就可以了,然后我顺便可以把一些需要写到配置里的东西提炼下,让这套系统成为一个可复制部署的 CMS 系统。 实操删库过程 第一步 很熟练的把代码复制一份,nginx 配置复制并修改一份。 第二步:删库 登陆数据库 新建库、切到新建库 删库:因为我部署这个博客系统的时候有把初始化数据库的 sql 文件放到服务器上,我看了下还在。然后直接source init.sql。 3步完成之后,有种莫名的感觉涌上心头,然后打开我的博客,发现里面数据已经空了。。其实我这里使用了Ph
今天要查询一个根据手机号返回用户的姓名,但是想要的 SQL 查询的结果的顺序和 in 后面数组里手机号顺序一样,使用 order by field(phone,111,222) select name,phone from users where phone in (18800000000,18800000000001) order by field(phone, 18800000000,18800000000001)
MySQL修改表的存储引擎有三种方式 alter table 该方式需要执行很长时间 mysql> alter table mytable engine=InnoDB; 导入导出 使用mysqldump导出表,修改导出文件里的create table后面表的名称。 创建新的表。 mysqldump导出的表里会包含drop table,所以要注意!删除该句。防止数据丢失 创建和查询 mysql> create table new_table_name like table_name; mysql> alter table new_table_name engin