首页 > 数据库 >MySQL8.0新特性之:不可见列

MySQL8.0新特性之:不可见列

时间:2023-10-30 15:04:08浏览次数:40  
标签:varchar name column 可见 MySQL8.0 特性 invisible table id

概念描述

  从MySQL8.0.23版本开始,MySQL支持不可见列(invisible columns),在之前版本中MySQL对所有列都是可见的,所谓不可见列就是指在正常默认查询中不会显示出来,用select * from 语句是无法查询出不可见属性的列的。

使用场景

  1. 隐藏字段:刻意隐藏不想展示的字段,比如备注,敏感值,关键信息等
  2. 业务侧需要:业务侧为前期表设计不充分,创建一些隐藏字段来保留业务数据,方便后期扩展需求
  3. 提升容错性:弥补业务初期创建错误表字段问题而开通的一个“后门儿”

测试验证

  1. 给现有表加不可见列:
root@localhost:rockdb 04:29:49 >select * from test_table;
+----+------+---------+
| id | name | address |
+----+------+---------+
|  1 | rock | beijing |
+----+------+---------+
1 row in set (0.00 sec)

mysql >show create table test_table\G
*************************** 1. row ***************************
       Table: test_table
Create Table: CREATE TABLE `test_table` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `address` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

#### 添加一个不可见列 id_no:
mysql >alter table test_table add column id_no varchar(20) default 'xxx' invisible;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

#### 正常select * 查询结果:
mysql >select * from test_table;
+----+------+---------+
| id | name | address |
+----+------+---------+
|  1 | rock | beijing |
+----+------+---------+
1 row in set (0.00 sec)

#### 显示指定不可见列进行查询:
mysql >select id,name,address,id_no from test_table;
+----+------+---------+-------+
| id | name | address | id_no |
+----+------+---------+-------+
|  1 | rock | beijing | xxx   |
+----+------+---------+-------+
1 row in set (0.00 sec)
  1. 创建带有不可见列的表
mysql > create table invisible_column_table(id int not null primary key auto_increment, name varchar(100),address varchar(200),ic1 varchar(100) default '' invisible,ic2 varchar(50) not null default '' invisible);
Query OK, 0 rows affected (0.01 sec)

mysql >show create table invisible_column_table\G
*************************** 1. row ***************************
       Table: invisible_column_table
Create Table: CREATE TABLE `invisible_column_table` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `address` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `ic1` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' /*!80023 INVISIBLE */,
  `ic2` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' /*!80023 INVISIBLE */,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

root@localhost:rockdb 04:45:26 >insert into invisible_column_table values (1,'tom','tianjin');
Query OK, 1 row affected (0.00 sec)

#### 正常select * 查询结果:
mysql >select * from invisible_column_table;
+----+------+---------+
| id | name | address |
+----+------+---------+
|  1 | tom  | tianjin |
+----+------+---------+
1 row in set (0.00 sec)

#### 显示指定不可见列进行查询:
mysql >select id,name,address,ic1,ic2 from invisible_column_table;
+----+------+---------+------+-----+
| id | name | address | ic1  | ic2 |
+----+------+---------+------+-----+
|  1 | tom  | tianjin |      |     |
+----+------+---------+------+-----+
1 row in set (0.00 sec)
  1. 不可见列的几种操作
#### 举例不可见列的一些常用操作
ALTER TABLE t1 CHANGE COLUMN j j DATE VISIBLE;
ALTER TABLE t1 MODIFY COLUMN j DATE INVISIBLE;
ALTER TABLE t1 ALTER COLUMN j SET VISIBLE;

mysql >alter table invisible_column_table change column ic1 ic3 varchar(100) visible;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql >alter table invisible_column_table modify column ic3 varchar(50) default 'zzz' invisible;
Query OK, 6 rows affected (0.02 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql >alter table invisible_column_table alter column ic3 set visible;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql >select * from invisible_column_table;
+----+----------+----------+------+
| id | name     | address  | ic3  |
+----+----------+----------+------+
|  1 | tom      | tianjin  |      |
|  2 | NULL     | NULL     |      |
|  3 | Hubei    | NULL     |      |
|  4 | Xinjiang | NULL     |      |
|  5 | Sam      | Shanghai |      |
|  6 | Tom      | Shenzhen | okr  |
+----+----------+----------+------+
6 rows in set (0.00 sec)
  1. 不可见列的相关元数据信息查询
#### 可以通过 show columns进行查询列是否可见
mysql > show columns from invisible_column_table;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int          | NO   | PRI | NULL    | auto_increment |
| name    | varchar(100) | YES  |     | NULL    |                |
| address | varchar(200) | YES  |     | NULL    |                |
| ic1     | varchar(100) | YES  |     |         | INVISIBLE      |
| ic2     | varchar(50)  | NO   |     |         | INVISIBLE      |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

#### 可以通过information_schema.columns表的 extra字段进行查询列的不可见性
mysql >select table_schema,table_name,column_name,data_type,extra from information_schema.columns where table_name='invisible_column_table';
+--------------+------------------------+-------------+-----------+----------------+
| TABLE_SCHEMA | TABLE_NAME             | COLUMN_NAME | DATA_TYPE | EXTRA          |
+--------------+------------------------+-------------+-----------+----------------+
| rockdb       | invisible_column_table | id          | int       | auto_increment |
| rockdb       | invisible_column_table | name        | varchar   |                |
| rockdb       | invisible_column_table | address     | varchar   |                |
| rockdb       | invisible_column_table | ic1         | varchar   | INVISIBLE      |
| rockdb       | invisible_column_table | ic2         | varchar   | INVISIBLE      |
+--------------+------------------------+-------------+-----------+----------------+
5 rows in set (0.00 sec)

限制和约束

  1. 表中必须至少有一个列是可见列,如果表中都是不可见列将会产生错误。
mysql >alter table test_table modify column id int invisible;
ERROR 4028 (HY000): A table must have at least one visible column.
  1. 不可见列支持常用的列属性: NULL,NOT NULL,DEFAULT,AUTO_INCREMENT等。
  2. 可以在不可见列上定义外键约束,外键约束可以引用不可见列。
  3. CHECK可以在不可见列上定义约束。对于新增或修改的行,违反CHECK不可见列上的约束会产生错误。
  4. CREATE TABLE … LIKE 包括不可见的列,它们在新表中依然是不可见的。
  5. CREATE TABLE … SELECT 不包括不可见列,除非在 SELECT部件中明确指定,但是即使显式指定,现有表中不可见的列在新表中也是可见的。
  6. INSERT INTO t1 VALUES(…)语句,不包含不可见列的值,否则会报错。
mysql >select table_schema,table_name,column_name,data_type,extra from information_schema.columns where table_name='invisible_column_table';
+--------------+------------------------+-------------+-----------+----------------+
| TABLE_SCHEMA | TABLE_NAME             | COLUMN_NAME | DATA_TYPE | EXTRA          |
+--------------+------------------------+-------------+-----------+----------------+
| rockdb       | invisible_column_table | id          | int       | auto_increment |
| rockdb       | invisible_column_table | name        | varchar   |                |
| rockdb       | invisible_column_table | address     | varchar   |                |
| rockdb       | invisible_column_table | ic1         | varchar   | INVISIBLE      |
| rockdb       | invisible_column_table | ic2         | varchar   | INVISIBLE      |
+--------------+------------------------+-------------+-----------+----------------+
5 rows in set (0.00 sec)

mysql >insert into invisible_column_table values(7,'Tom','Shenzhen','xxx','yyy');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
  1. mysqldump 和 mysqlpump 导出数据时使用的是SHOW CREATE TABLE,因此它们在转储表定义中包含不可见列,它们还包括转储数据中不可见列的值。将转储文件重新加载到不支持不可见列的旧版本MySQL中会导致版本特定的注释被忽略,从而将所有不可见列创建为可见列。

参考文档

https://dev.mysql.com/doc/refman/8.0/en/invisible-columns.html

标签:varchar,name,column,可见,MySQL8.0,特性,invisible,table,id
From: https://blog.51cto.com/u_13482808/8089058

相关文章

  • MySQL8.0新特性之:不可见索引
    概念描述  MySQL从8.0版本开始支持不可见索引(invisibleindex)也可叫隐式索引,隐形索引或者隐藏索引。不可见索引是不被MySQL优化器使用的,但是优化器会正常维护它。使用场景非主键上的索引使用测试删除索引对性能的影响,而无需进行破坏性更改(通常对于大表来说,删除或者重建索引的影响......
  • AH6971-9V-15v电压升降12V2A芯片解决方案:参数特性和应用领域
    9V-15V升降12V2A芯片解决方案:参数特性和应用领域随着科技的发展,各种智能设备的需求在不断增长,而电源作为智能设备的重要组成部分,其稳定性和效率直接影响着设备的性能。在此背景下,9V-15V升降12V2A芯片解决方案应运而生。参数特性:宽输入电压范围:5V~35V,能够适应多种电源环境。高效......
  • SpringBoot3特性——错误信息Problemdetails
    SpringFramework6实现了HTTPAPI规范RFC7807的问题详细信息。在本文中,我们将学习如何在SpringBoot3RESTAPI(使用SpringFramework6)中处理异常,并使用ProblemDetailsAPI提供错误响应。详见https://www.sivalabs.in/spring-boot-3-error-reporting-using-proble......
  • LCD液晶防干扰段码显示屏驱动芯片VK1C21A/B/C/D/DA/E/EA具备显示效果好,静电耐压高等优
    产品型号:VK1C21A/B产品品牌:永嘉微电/VINKA封装形式:SSOP48/LQFP48可定制裸片:DICE(COB邦定片);COG(邦定玻璃用)产品年份:新年份原厂,工程服务,技术支持! 概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可通过......
  • Flutter/Dart第18天:Dart特性之可调用对象
    Dart官方文档:https://dart.dev/language/callable-objects重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。可调用对象:Dart实例如果实现了call()方法,那么实例就可以像函数那样被调用,这......
  • 重磅更新!Sermant 1.2.0 release版本新特性速览
    10月,Sermant社区正式发布了1.2.0release版本,距离上一次的大版本发布仅三个月。本次新版本带来了多个令人兴奋的新特性,主要包含SermantAgent框架能力的优化和提升以及新增了流量标签透传插件,将极大地提升用户和开发者的体验,帮助大家将Sermant运用到更多的流量治理场景中。(Sermant......
  • Java8新特性
    Stream流可以说是Java8新特性中用起来最爽的一个功能了,有了它,从此操作集合告别繁琐的for循环。但是还有很多小伙伴对Stream流不是很了解。今天就通过本篇,一起深入了解下如何使用它。Java8Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操......
  • Tita 升级|「OKR」支持设置企业默认可见范围
    升级详情Tita-OKR和新绩效一体化管理平台一、企业默认目标可见范围 1.OKR创建过程忘记修改可见范围可能导致输据泄露,现在企业可设置自己偏好的目标可见范围管理员可在企业管理规定>OKR规定>目标默认可见范围中进行设置2.开启后有什么影响创建目标时,会与企业设置的......
  • 逻辑运算符 && 和 || 的短路特性
    ⛩️博主主页:@威化小餅干......
  • java中jdk8新特性
    Java中Jdk8的新特性包括:Lambda表达式:Lambda表达式是推动Java8发布的最重要新特性,允许把函数作为一个方法的参数或者把代码看成数据,使代码更加简洁紧凑。新的日期API:引入新的日期API,提供更加便捷的日期处理方式。Optional:引入Optional类,可以用来表示值存在或不存在的情况。Base64:内......