tidb变更大小写敏感问题的总结
作者: sustyle 原文来源: https://tidb.net/blog/2a72bc13
1 背景
近期,我们线上的tidb集群就遇到一个变更忽略大小写的需求,本来以为一个改表工单就解决了,但是业务反馈工单完成后,大小写仍旧敏感,本文就来总结一下这类需求可能遇到的问题以及如何避坑,仅供参考。
本文演示的实验环境是tidb 4.0.13版本。
tidb集群默认是大小写敏感,如果初始化集群的时候没有启用相关参数【new_collations_enabled_on_first_bootstrap】,后期想变更为忽略大小写就十分麻烦,可能还存在一定的风险。
2、问题复现
(1)准备测试环境
mysql> use tidbtest
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> create table t(id int not null primary key,name varchar(50) not null default '',age int not null default 0,unique key uk_name(name),key idx_age(age));
Query OK, 0 rows affected (0.07 sec)mysql> show create table t\G
*************************** 1. row ***************************Table: t
Create Table: CREATE TABLE `t` (`id` int(11) NOT NULL,`name` varchar(50) NOT NULL DEFAULT '',`age` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`id`),UNIQUE KEY `uk_name` (`name`),KEY `idx_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.01 sec)mysql> mysql> insert into t values(1,'a',10),(2,'A',11);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from t;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.00 sec)mysql>
测试表【t】id是主键字段,name是唯一索引字段,因为是大小写敏感,所以'a' 和 'A'是可以写进去的,唯一索引也是为了验证大小写敏感这一性质。
(2)修改排序集
mysql> alter table t modify `name` varchar(50) not null COLLATE utf8mb4_general_ci DEFAULT '';
Query OK, 0 rows affected (0.07 sec)mysql> show create table t\G
*************************** 1. row ***************************Table: t
Create Table: CREATE TABLE `t` (`id` int(11) NOT NULL,`name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',`age` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`id`),UNIQUE KEY `uk_name` (`name`),KEY `idx_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)mysql> select * from t where name = 'a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
+----+------+-----+
1 row in set (0.00 sec)mysql> select * from t where name = 'A';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | A | 11 |
+----+------+-----+
1 row in set (0.01 sec)mysql>
可以看到,修改排序集操作成功了,但是从实际测试看没有生效。
3、测试
经过查阅官方文档后发现是因为tidb从4.0开始支持collation规则但是默认是关闭的,对应的参数是new_collation_enabled。该参数在6.0版本开始默认开启。下面将该参数调整为True试试。
该参数对应的配置文件参数是 new_collations_enabled_on_first_bootstrap,要求是新集群才生效,即旧集群启用这个参数是无法启用collation规则,需要直接更改tidb系统的参数才生效。
(1)验证
mysql> select * from mysql.tidb where VARIABLE_NAME = 'new_collation_enabled';
+-----------------------+----------------+----------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE | COMMENT |
+-----------------------+----------------+----------------------------------------------------+
| new_collation_enabled | False | If the new collations are enabled. Do not edit it. |
+-----------------------+----------------+----------------------------------------------------+
1 row in set (0.00 sec)mysql> update mysql.tidb set VARIABLE_VALUE = 'True' where VARIABLE_NAME = 'new_collation_enabled' limit 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from mysql.tidb where VARIABLE_NAME = 'new_collation_enabled';
+-----------------------+----------------+----------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE | COMMENT |
+-----------------------+----------------+----------------------------------------------------+
| new_collation_enabled | True | If the new collations are enabled. Do not edit it. |
+-----------------------+----------------+----------------------------------------------------+
1 row in set (0.01 sec)mysql> select * from t where name = 'a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
+----+------+-----+
1 row in set (0.00 sec)mysql> select * from t where name = 'A';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | A | 11 |
+----+------+-----+
1 row in set (0.01 sec)mysql>
可以看到调整为True后还是不生效,原因是这个参数需要重启tidb组件才能生效。
tiup cluster reload cluster_name -R tidb
注意这里用的是reload。需要注意,这种情况下在线上一定不能reload或者重启,要不然容易引发故障,如下测试,查询会失效。
重启以后再次查看发现一个诡异的事情,之前的查询条件不管是使用小写还是大写现在都没法查询到数据,但是数据真实的存在表里,于是乎就想着走强制索引试试。
mysql> select * from mysql.tidb where VARIABLE_NAME = 'new_collation_enabled';
+-----------------------+----------------+----------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE | COMMENT |
+-----------------------+----------------+----------------------------------------------------+
| new_collation_enabled | True | If the new collations are enabled. Do not edit it. |
+-----------------------+----------------+----------------------------------------------------+
1 row in set (0.00 sec)mysql> use tidbtest
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t where name = 'a';
Empty set (0.00 sec)mysql> select * from t where name = 'A';
Empty set (0.00 sec)mysql> select * from t;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.00 sec)mysql>
如果name字段不带索引,这里的查询是可以查到数据的,而且是符合预期,即大小写不再敏感。
下面使用强制索引试试
mysql> select * from t where name = 'a';
Empty set (0.00 sec)mysql> select * from t force index(idx_age) where name = 'a';
Empty set (0.00 sec)mysql> desc select * from t force index(idx_age) where name = 'a';
+-------------+---------+------+------------------------------+---------------+
| id | estRows | task | access object | operator info |
+-------------+---------+------+------------------------------+---------------+
| Point_Get_1 | 1.00 | root | table:t, index:uk_name(name) | |
+-------------+---------+------+------------------------------+---------------+
1 row in set (0.00 sec)mysql> desc select * from t where name = 'a';
+-------------+---------+------+------------------------------+---------------+
| id | estRows | task | access object | operator info |
+-------------+---------+------+------------------------------+---------------+
| Point_Get_1 | 1.00 | root | table:t, index:uk_name(name) | |
+-------------+---------+------+------------------------------+---------------+
1 row in set (0.00 sec)mysql>
可以看到强制索引并不能解决问题,通过执行计划发现还是走了uk_name这个索引。
起初以为跟这个表的数据量少有关系,后来追加了10000行测试数据发现结果还是一样。
后来尝试通过模糊查询发现只有将'%a'或者'%A'才能查到数据,且大小写已经不敏感。
mysql> select * from t where name like '%a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.01 sec)mysql> select * from t where name like '%a%';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.02 sec)mysql> select * from t where name like '%A';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.02 sec)mysql> select * from t where name like '%A%';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.02 sec)mysql> select id,concat('-',name,'-') name, age from t where name like '%a%';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | -a- | 10 |
| 2 | -A- | 11 |
+----+------+-----+
1 row in set (0.00 sec)mysql>
从测试结果猜测可能是uk_name这个索引的问题,忽略大小写且在唯一约束条件下,'a'和'A'能同时存在,这显然不合理,于是乎就想着重建这个索引。
mysql> alter table t drop index uk_name;
Query OK, 0 rows affected (0.26 sec)mysql> select * from t where name = 'A';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.01 sec)mysql> select * from t where name = 'a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.02 sec)mysql> desc select * from t where name = 'A';
+-------------------------+---------+-----------+---------------+--------------------------------+
| id | estRows | task | access object | operator info |
+-------------------------+---------+-----------+---------------+--------------------------------+
| TableReader_7 | 1.00 | root | | data:Selection_6 |
| └─Selection_6 | 1.00 | cop[tikv] | | eq(tidbtest.t.name, "A") |
| └─TableFullScan_5 | 2.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
+-------------------------+---------+-----------+---------------+--------------------------------+
3 rows in set (0.00 sec)mysql>
可以看到删除uk_name这个索引后,查询就正常了。
mysql> alter table t add unique index uk_name(name);
ERROR 1062 (23000): Duplicate entry 'a' for key 'uk_name'
mysql> alter table t add index idx_name(name);
Query OK, 0 rows affected (0.26 sec)mysql> select * from t where name = 'a';
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | A |
+----+------+
2 rows in set (0.00 sec)mysql> select * from t where name = 'A';
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | A |
+----+------+
2 rows in set (0.01 sec)mysql>
因'a','A'是重复数据,所以没法加唯一索引,加一个普通二级索引。
4、解决方案
通过测试发现,这类需求比较棘手,那能不能解决呢?答案当然是肯定的,只是成本问题,下面提供两个方案,仅供参考。
(1)直接在原集群进行操作
这个方案适合小表的场景,主要考虑点是操作过程中对目标字段需要重建索引(如果有索引的话),所以要能容忍全表扫描带来的性能问题。
mysql> use tidbtest
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t where name = 'A';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | A | 11 |
+----+------+-----+
1 row in set (0.00 sec)mysql> select * from t where name = 'a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
+----+------+-----+
1 row in set (0.00 sec)mysql> alter table t modify `name` varchar(50) not null COLLATE utf8mb4_general_ci DEFAULT '';
ERROR 8200 (HY000): Unsupported modifying collation of column 'name' from 'utf8mb4_bin' to 'utf8mb4_general_ci' when index is defined on it.
mysql>
/*目标字段没有索引直接就能修改成功*/
如果目标字段是索引字段,则无法直接修改排序集,需要删除索引后再修改。
mysql> alter table t drop index uk_name;
Query OK, 0 rows affected (0.25 sec)mysql> alter table t modify `name` varchar(50) not null COLLATE utf8mb4_general_ci DEFAULT '';
Query OK, 0 rows affected (0.07 sec)mysql> select * from t where name = 'a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.02 sec)mysql> alter table t add index idx_name(name);
Query OK, 0 rows affected (0.85 sec)
/*如果目标字段没有索引就忽略即可*/
/*如果目标字段是唯一索引则需要考虑重复值问题,有可能加不上*/mysql> select * from t where name = 'a';
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 10 |
| 2 | A | 11 |
+----+------+-----+
2 rows in set (0.00 sec)mysql>
可以看到,大小写已经不敏感了。
(2)集群迁移(物理备份)
这个方案适合目标表是大表的场景。具体操作略,下面简单提供一个思路:
- 部署好一套新集群
- 利用br备份原集群
- 利用br将备份恢复到新集群
- 使用ticdc进行增量同步
- 待数据同步后,对新集群的目标表配置大小写不敏感
- 协同业务进行验证
- 切换流量,将业务流量切到新集群
另外,待数据同步后,是在新集群变更大小写敏感参数,因为新集群这时候未接受业务流量,所以重启,重建索引等可以放心操作,具体操作流程请参考第一个方案。
(3)集群迁移(逻辑备份)
这个方案适合目标表是大表的场景,这也是官方建议的方案。具体操作略,下面简单提供一个思路:
- 部署好一套新集群(初始化的时候直接启用new_collations_enabled_on_first_bootstrap参数)
- 利用逻辑备份工具备份旧集群
- 利用逻辑备份工具恢复数据到新集群
- 使用ticdc进行增量同步
- 待数据同步后,协同业务进行验证
- 切换流量,将业务流量切到新集群
这种架构可能存在一个问题,上游是大小写敏感,但是下游大小写不敏感,对于唯一索引字段可能会导致同步失败。
5、总结
官方建议有需要忽略大小写需求的话,在初始化集群的时候就启用该参数,已经初始化的集群,无法通过更改该配置项打开或关闭新的 collation 框架,但是我实际测试过程中发现直接变更【mysql.tidb】表的new_collation_enabled参数是能关闭或者开启的,而且也能符合预期。
(1)如果目标字段是非索引字段,直接变更字段排序集以及系统参数即可,待合适时间重新加载tidb组件即可生效。
(2)如果目标表是小表,全表扫描的查询成本与使用目标字段的索引的查询成本相差不大,也可直接参考第一点进行操作。
(3)如果目标表是大表,则需要慎重一些,需要考虑通过集群迁移的方式进行变更此类需求。
(4)如果集群已经启用 collation 框架,则不能对索引字段进行变更排序集操作,否则会报错。
new_collation_enabled=True
mysql> alter table t2 modify `name` varchar(50) not null COLLATE utf8mb4_general_ci DEFAULT '';
ERROR 8200 (HY000): Unsupported modifying collation of column 'name' from 'utf8mb4_bin' to 'utf8mb4_general_ci' when index is defined on it.
mysql>
综上所述,tidb集群想要变更大小写敏感问题需要考虑的风险点较多,需要用户根据自身环境进行充分评估测试,本文涉及的测试及方案仅供参考,非线上环境的操作建议。
如果存在上下游关系的架构中,一定要评估好风险,避免因调整了tidb的大小写敏感问题导致上下游同步异常。
6、写在最后
本文对tidb集群变更大小写敏感问题做了一下分析及总结,总体来说此类需求是存在一定的风险的,各公司的业务场景也不一样,需求也不同,还可能碰上其他未知的问题,本文所有内容仅供参考。
相关文章:
tidb变更大小写敏感问题的总结
作者: sustyle 原文来源: https://tidb.net/blog/2a72bc13 1 背景 近期,我们线上的tidb集群就遇到一个变更忽略大小写的需求,本来以为一个改表工单就解决了,但是业务反馈工单完成后,大小写仍旧敏感&…...
法规标准-UN R158标准解读
UN R158是做什么的? UN R158全名为针对驾驶员识别车辆后方弱势道路使用者,联合国对倒车系统和机动车的统一规定,该法规涉及批准倒车和机动车辆的装置,主要为保证倒车时避免碰撞,方便驾驶员观察了解车辆后部人员和物体…...
160个CrackMe之002
这道题就很简单 有了第一道题目的支持 我们就能做 首先 我们先要下载Msvbvm50.dll Msvbvm50.dll下载_Msvbvm50.dll最新版下载[修复系统丢失文件]-下载之家 然后我们可以运行程序了 比之前那个还简单 就是输入 然后比对 报错或者成功 开始逆向分析 先去常量中进行查找 找…...
3. 响应状态码及Response对象的status_code属性
3. 响应状态码及Response对象的status_code属性 文章目录 3. 响应状态码及Response对象的status_code属性1. 响应状态码2. 响应状态码共分为5种类型2.1 1xx(临时响应)2.2 2xx (成功)2.3 3xx (重定向)2.4 4x…...
MIME 类型列表 03
看表~按照内容类型排列的 MIME 类型列表 类型/子类型扩展名application/envoyevyapplication/fractalsfifapplication/futuresplashsplapplication/htahtaapplication/internet-property-streamacxapplication/mac-binhex40hqxapplication/msworddocapplication/msworddotappl…...
SpringBoot项目登录并接入MFA二次认证
MFA多因素认证(Multi-Factor Authentication ): 一些需要身份认证的服务(如网站),为了提升安全性,通常会在账号密码登录成功后,要求用户进行第二种身份认证,以确保是正确用户登录,避…...
算法与数据结构(三)
一、堆 1,堆结构就是用数组实现的完全二叉树结构 根节点的左孩子的下标为:2i1,右孩子为2i2。两个孩子的父节点为(i-1)/2向下取整 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 从下往上将孩子与父节点进行比较,如果子叶…...
亚马逊云科技出海日,让数字经济出海扩展到更多行业和领域
数字化浪潮之下,中国企业的全球化步伐明显提速。从“借帆出海”到“生而全球化”,中国企业实现了从传统制造业“中国产品”出口,向创新“中国技术”和先导“中国品牌”的逐步升级。 作为全球云计算的开创者与引领者,亚马逊云科技…...
Pb协议的接口测试
【摘要】 Protocol Buffers 是谷歌开源的序列化与反序列化框架。它与语言无关、平台无关、具有可扩展的机制。用于序列化结构化数据,此工具对标 XML ,支持自动编码,解码。比 XML 性能好,且数据易于解析。更多有关工具的介绍可参考…...
2. 分布式文件系统 HDFS
2. 分布式文件系统 HDFS 1. 引入HDFS【面试点】 问题一:如果一个文件中有 10 个数值,一行一个,并且都可以用 int 来度量。现在求 10 个数值的和 思路: 逐行读取文件的内容把读取到的内容转换成 int 类型把转换后的数据进行相加…...
借助金融科技差异化发展,不一样的“破茧”手法
撰稿 | 多客 来源 | 贝多财经 民营银行的诞生顺应了普惠金融的要求,承担着支持民营经济、服务小微的历史使命。经过近年来的发展,19家民营银行形成了特色化、差异化的发展模式,并用各自本领实践普惠金融的初心。 本文从多家民营银行在核心技…...
typescript中type、interface的区别
一、概念定义 interface:接口 在TS 中主要用于定义【对象类型】,可以对【对象】的形状进行描述。type :类型别名 为类型创建一个新名称,它并不是一个类型,只是一个别名。 二,区别 interface: …...
Ingress详解
Ingress Service对集群外暴露端口两种方式,这两种方式都有一定的缺点: NodePort :会占用集群集群端口,当集群服务变多时,缺点明显LoadBalancer:每个Service都需要一个LB,并且需要k8s之外设备支…...
【递归算法的Java实现及其应用】
文章目录 递归算法概述递归算法的实现步骤递归算法的Java实现递归算法的底层工作原理递归算法的底层代码讲解(优先级高)递归算法的实际应用场景递归算法在场景中解决的问题递归算法的优点和缺点总结 递归算法概述 递归算法是一种通过调用自身来解决问题…...
2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)
目录 2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)1、A2、Bx3、Cut4、Diff5、EchoN6、Farmer7、GcdGame8、HouseSub9、IMissYou!10、Jargonless 2023年度第四届全国大学生算法设计与编程挑战赛(春季赛) 1、A 题目描述…...
如何用PHP获取各大电商平台的数据
PHP获取API数据是指使用PHP语言从web服务中提取数据。API是指应用程序接口,它允许应用程序之间进行交互和通信,并且允许一个应用程序从另一个应用程序获取数据。PHP是一种网站开发语言,它可以使用多种方式来获取API数据。 在PHP中࿰…...
一站式完成车牌识别任务:从模型优化到端侧部署
交通领域的应用智能化不断往纵深发展,其中最为成熟的车牌识别早已融入人们的日常生活之中,在高速公路电子收费系统、停车场等场景中随处可见。一些企业在具体业务中倾向采用开源方案降低研发成本,但现有公开的方案中少有完成端到端的车牌应用…...
Linux4.8Nginx Rewrite
文章目录 计算机系统5G云计算第六章 LINUX Nginx Rewrite一、Nginx Rewrite 概述1.常用的Nginx 正则表达式2.rewrite和location3.location4.实际网站使用中,至少有三个匹配规则定义5.rewrite6.rewrite 示例 计算机系统 5G云计算 第六章 LINUX Nginx Rewrite 一、…...
DHT11温湿度传感器
接口定义 传感器通信 DHT11采用简化的单总线通信。单总线仅有一根数据线(SDA),通信所进行的数据交换、挂在单总线上的所有设备之间进行信号交换与传递均在一条通讯线上实现。 单总线上必须有一个上拉电阻(Rp)以实现单…...
RestTemplate超简单上手
目录 1.什么是RestTemplate? 2.RestTemplate的使用 2.1spring环境下 注意1:RestTemplate中发送请求execute()和exchange()方法的区别 execute()方式 exchange()方式 二者的区别 注意2:进阶配置——底层HTTP客户端 2.2非spring环境下 1.什么是R…...
监控系统设计原则及实现目标
1.1.1.1 1 .完善的设计理念: 包括符合国际发展潮流的特性化设计,完整的安防监控及围墙周界报警系统 的布线、设备安装、调试、测试、验收的“交钥匙”工程管理制度,以及符合标 准的质量控制体系。 1.1.1.2 设计原则…...
VulnHub项目:MONEYHEIST: CATCH US IF YOU CAN
靶机名称: MONEYHEIST: CATCH US IF YOU CAN 地址:MoneyHeist: Catch Us If You Can ~ VulnHub 这个系列是一部剧改编,还是挺好看的,大家有兴趣可以去看看! 废话不多说,直接上图开始! 渗透…...
对象存储OSS简介,一分钟了解对象存储OSS
对象存储(Object Storage)是一种新兴的数据存储方式,与传统的文件系统和块存储不同,对象存储以对象为基本单位进行数据管理和存储。在对象存储中,每个对象都有唯一的标识符,并包含了数据本身以及与之相关的…...
SpringCloud_微服务基础day2(Eureka简介与依赖导入,服务注册与发现)
p6:Eureka简介与依赖导入 前面我们了解了如何对单体应用进行拆分,并且也学习了如何进行服务之间的相互调用,但是存在一个问题,就是虽然服务拆分完成,但是没有一个比较合理的管理机制,如果单纯只是这样编写,…...
#tmux# #终端# 常用工具tmux
tmux tmux是一个终端复用工具,允许用户在一个终端会话中同时管理多个终端窗口,提高了终端使用效率,尤其在服务器上进行远程管理时更加实用。在tmux中,可以创建多个终端窗口和窗格,并在这些窗口和窗格之间自由切换&…...
后端服务架构高性能设计之道
“N 高 N 可”,高性能、高并发、高可用、高可靠、可扩展、可维护、可用性等是后台开发耳熟能详的词了,它们中有些词在大部分情况下表达相近意思。本序列文章旨在探讨和总结后台架构设计中常用的技术和方法,并归纳成一套方法论。 前言 本文主…...
Python中的Time和DateTime
Python在处理与时间相关的操作时有两个重要模块:time和datetime。在本文中,我们介绍这两个模块并为每个场景提供带有代码和输出的说明性示例。 time模块主要用于处理时间相关的操作,例如获取当前时间、时间的计算和格式化等。它提供了一些函数…...
UNIX网络编程卷一 学习笔记 第十九章 密钥管理套接字
随着IP安全体系结构(IPsec)的引入,密钥加密和认证密钥的管理越来越需要一套标准机制。RFC 2367介绍了一个通用密钥管理API,可用于IPsec和其他网络安全服务,该API创建了一个新协议族,即PF_KEY域,…...
excel如何实现识别文本在对应单元格填上数据?
要实现 Excel 识别文本在对应单元格填上数据,有以下两种方法: 方法一:使用 VLOOKUP 函数 1. 在 Excel 工作表中,输入一个表格,列名为对应的文本,行名为不同条目。 2. 准备输入数据,在一个新的…...
Groovy 基本语法
一、简介 类型转换:当需要时,类型之间会自动发生类型转换: 字符串(String)、基本类型(如int) 和类型的包装类(如Integer) 类说明:如果在一个groovy 文件中没有任何类定义,它将被当做script 来处理,也就意味着这个文件将…...
做c语言题目的网站/智能识别图片
Writer:BYSocket(泥沙砖瓦浆木匠)一、前言针对并发,老生常谈了。目前一个通用的做法有两种:锁机制:1.悲观锁;2.乐观锁。但是这篇我主要用于记录我这次处理的经历,另外希望能看的大神,大牛&#…...
wordpress和seo权重/新闻软文范例大全
在上个月我们为大家进行了一次超深度的《电动车冬季续航挑战》,测试的车型都是目前国内市面上非常流行以及热门的电动车型。那篇文章放出来后我们也发现了网友们对这篇文章的热烈反响,所以这一次新出行再一次来到了北京继续为大家做测试!此次…...
wordpress环境包/网络广告营销有哪些
关注公众号“AI算法修炼营”,选择“星标”公众号。精选作品,第一时间送达在图像几何变换时,无法给有些像素点直接赋值,例如,将图像放大两倍,必然会多出一些无法被直接映射的像素点,对于这些像素…...
免费建设交友网站/微信营销和微博营销的本质区别
一、反向代理 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代…...
wordpress查看权限/重庆自动seo
燃尽图: 今天我们一起开了个会,讨论我们面向的对象,和故事的由来。转载于:https://www.cnblogs.com/supreme1/p/10099651.html...
专业微信网站建设公司首选公司哪家好/百度公司介绍
作为编码者,美工基础是偏弱的。我们可以参考一些成熟的网页PS教程,提高自身的设计能力。套用一句话,“熟读唐诗三百首,不会作诗也会吟”。 本系列的教程来源于网上的PS教程,都是国外的,全英文的。本人尝试翻…...