MySQL 扩展 VARCHAR 长度遭遇问题的总结

MySQL扩展varchar字段长度能否Online DDL 面对Online DDL的众多场景,DBdoctor免费的SQL审核功能可以快速识别Online DDL,支撑线上DDL变更,有效预防锁表问题,欢迎小伙伴们下载体验!在MySQL 5.6 版本之前,所有的DDL变更都需要锁表,导致大量线程处于“Waiting for meta data lock”的状态,5.6版本引入Online DDL新特性,部分DDL 变更不需要锁表,引入算法In-Place和Copy(8.0增加Instant),其中 Instant,In-Place可以实现无锁变更。 阅读详情

最近,业务反馈有个扩展 VARCHAR 改表需求失败多次,需要干预处理一下。

作者:莫善,某互联网公司高级 DBA。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 3600 字,预计阅读需要 12 分钟。

背景介绍

最近,业务反馈有个扩展 VARCHAR 改表需求失败多次,需要干预处理一下。

经过排查分析得出,这是由于改表系统解析改表需求得出错误的改表方案导致,即这类改表可以满足快速改表操作(直接使用 ALTER TABLE),理论上任务下发后能马上改完,但是工单结果是执行触发 10 秒超时,最终工单失败。

原则上,VARCHAR 类型的扩展是可以满足快速改表的,我们的改表工单针对这类需求也是支持的,但是实际结果与预期不符,这到底是工单系统的 Bug?还是 MySQL 的坑呢?

本文就来总结一下 扩展 VARCHAR 长度可能会遇到的一些问题,以及我们给出的解决方案,仅供参考。

仅讨论 MySQL 5.7 及以后的版本。

MySQL Online DDL

OperationExtending VARCHAR column size
In PlaceYes
Rebuilds TableNo
Permits Concurrent DMLYes
Only Modifies MetadataYes

上表是 MySQL 官方文档中关于 Online DDL 章节中的一部分。可以看到关于 VARCHAR 类型的字段的扩展是可以原地改表,且仅仅改了元数据,理论上敲完回车就执行结束。

当然针对这种场景,还是有一些条件的,直接贴原话:

The number of length bytes required by a VARCHAR column must remain the same. For VARCHAR columns of 0 to 255 bytes in size, one length byte is required to encode the value. For VARCHAR columns of 256 bytes in size or more, two length bytes are required. As a result, in-place ALTER TABLE only supports increasing VARCHAR column size from 0 to 255 bytes, or from 256 bytes to a greater size. In-place ALTER TABLE does not support increasing the size of a VARCHAR column from less than 256 bytes to a size equal to or greater than 256 bytes. In this case, the number of required length bytes changes from 1 to 2, which is only supported by a table copy (ALGORITHM=COPY).

https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html

VARCHAR 是变长类型,实际存储的内容不固定,需要 1 或者 2 个字节来表示实际长度,所以修改前和修改后,这个字节数要求是一致。

有了这个技术基础,我们的改表系统就针对这类需求做了优化,可以支持直接使用 ALTER TABLE 进行改表,如果是大表可以节省很多时间,提升效率,也因此遇到了很多问题,才有了这篇文章。

问题汇总

首先简单介绍一下我们的改表系统的处理逻辑,我们会根据业务的改表需求去选择最优的改表方案:

  1. 满足快速改表就直接使用 ALTER TABLE 进行操作。

    比如,删除索引,修改表名/列名,修改默认值/注释,扩展 VARCHAR 长度,小表添加唯一索引以及 8.0 快速加列等等。

  2. 不满足快速改表就优先选择 gh-ost 进行改表

    binlog format 不为 ROW 则不能使用 gh-ost,添加唯一索引必须使用 gh-ost。

  3. 不满足 gh-ost 都会选择 pt-osc 进行改表。

    其中添加唯一索引会直接失败。

那么问题来了,我们是如何判断业务改表需求是不是扩展 VARCHAR?

其实思路也很简单,就是检查改表前后的 information_schema.columns 记录,用到的 SQL 如下:

select * from information_schema.columns where table_schema = 'db' and table_name = 'table' and column_name = 'col';

# 样例数据
*************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: information_schema
              TABLE_NAME: CHARACTER_SETS
             COLUMN_NAME: CHARACTER_SET_NAME
        ORDINAL_POSITION: 1
          COLUMN_DEFAULT: 
             IS_NULLABLE: NO
               DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 32
  CHARACTER_OCTET_LENGTH: 96
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: utf8
          COLLATION_NAME: utf8_general_ci
             COLUMN_TYPE: varchar(32)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select
          COLUMN_COMMENT: 
   GENERATION_EXPRESSION: 
  • DATA_TYPE 值是 VARCHAR
  • CHARACTER_MAXIMUM_LENGTH 的值,要求改表后要大于等于改表前的值
  • CHARACTER_OCTET_LENGTH 的值,要求改表前后这个值要么是都小于等于 255,要么是都大于 255
  • 除 DATA_TYPE/COLUMN_TYPE/CHARACTER_MAXIMUM_LENGTH/CHARACTER_OCTET_LENGTH 字段外的其余字段要求改表前后保持一致

问题一:默认值问题

我们发现,如果还改了字段名、注释、默认值这种元数据信息,依旧是可以快速改表,于是乎就进行了优化,不再比较这三个属性 COLUMN_NAME|COLUMN_COMMENT|COLUMN_DEFAULT。

关于默认值,看起来有点复杂,最开始也是想跑偏了,认为判断 COLUMN_DEFAULT 的值就行,比较这个值前后要么都是 null,要么都不是 null。都不是 null 的情况下可以是任意值,比如可以用下面的逻辑判断改表前后是一致即可。

if(COLUMN_DEFAULT is null ,null,"")

但是有个问题,如果一个字段从 允许为 null 默认值为 1 变成 不允许为null 默认值也是 1,该值改表前后也是一致的,具体测试如下:

CREATE TABLE `tb_test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `rshost` varchar(20) DEFAULT '1' COMMENT '主机地址',
  `cpu_info` json DEFAULT NULL COMMENT 'cpu信息 json串',
  `mem_info` json DEFAULT NULL COMMENT 'mem信息 json串, 单位是GB',
  `io_info` json DEFAULT NULL COMMENT '磁盘io使用情况, 单位是KB',
  `net` json DEFAULT NULL COMMENT '网络使用情况, 单位是KB(speed单位是MB/S)',
  `a_time` datetime NOT NULL DEFAULT '2022-01-01 00:00:00',
  PRIMARY KEY (`id`),
  KEY `idx_a_time` (`a_time`),
  KEY `idx_rshost` (`rshost`)
) ENGINE=InnoDB AUTO_INCREMENT=623506728 DEFAULT CHARSET=utf8mb4
>select * from information_schema.columns where table_name = 'tb_test' and column_name = 'rshost'\G
*************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: dbzz_monitor
              TABLE_NAME: tb_test
             COLUMN_NAME: rshost
        ORDINAL_POSITION: 2
          COLUMN_DEFAULT: 1
             IS_NULLABLE: YES
               DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 30
  CHARACTER_OCTET_LENGTH: 120
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: utf8mb4
          COLLATION_NAME: utf8mb4_general_ci
             COLUMN_TYPE: varchar(30)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 主机地址
   GENERATION_EXPRESSION: 
1 row in set (0.00 sec)

>alter table tb_test modify `rshost` varchar(30) not null DEFAULT '1' COMMENT '主机地址';
Query OK, 1000000 rows affected (13.68 sec)
Records: 1000000  Duplicates: 0  Warnings: 0

>select * from information_schema.columns where table_name = 'tb_test' and column_name = 'rshost'\G
*************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: dbzz_monitor
              TABLE_NAME: tb_test
             COLUMN_NAME: rshost
        ORDINAL_POSITION: 2
          COLUMN_DEFAULT: 1
             IS_NULLABLE: NO
               DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 30
  CHARACTER_OCTET_LENGTH: 120
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: utf8mb4
          COLLATION_NAME: utf8mb4_general_ci
             COLUMN_TYPE: varchar(30)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 主机地址
   GENERATION_EXPRESSION: 
1 row in set (0.00 sec)

可以看到 COLUMN_DEFAULT 这个列的值是非 null 且不变,按照上面的判断逻辑会认为可以快速改表,但是我们知道实际上这个需求是需要 copy 数据的。

其实,关于默认值问题使用 IS_NULLABLE 的值就可以完美解决, 如果是 null 到 not null 这个值会从 yes 变成 no;如果是 not null 到 null,这个值会从 no变成 yes。

所以最终解决方案仅比较 IS_NULLABLE 即可,只要改表前后一致就认为默认值这个属性满足快速改表。

在测试这个问题的时候发现一个现象:not null 到 null 可以使用 inplace 算法,但是需要 copy 数据;null 到 not null 不能使用 inplace,请看下面的用例:

-- not null --> null可以使用inplace
>alter table tb_test modify `rshost` varchar(30) DEFAULT '1' COMMENT '主机地址' ,ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (3.45 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- null --> not null不可以使用inplace
>alter table tb_test modify `rshost` varchar(30) not null DEFAULT '1' COMMENT '主机地址' ,ALGORITHM=INPLACE, LOCK=NONE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: cannot silently convert NULL values, as required in this SQL_MODE. Try ALGORITHM=COPY.
>

-- 可以使用下面的操作查看改表进度拷贝数据的情况,第一次使用需要开启此功能
-- UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
-- UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';

>SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current;
+-----------------------------+----------------+----------------+
| EVENT_NAME                  | WORK_COMPLETED | WORK_ESTIMATED |
+-----------------------------+----------------+----------------+
| stage/sql/copy to tmp table |         272289 |         978903 |
+-----------------------------+----------------+----------------+
1 row in set (0.00 sec)

-- 为了避免测试干扰,检查events_stages_history表之前可以先清空,切记不要对线上环境做此操作。
-- TRUNCATE TABLE performance_schema.events_stages_history;
>SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_history;
+-----------------------------+----------------+----------------+
| EVENT_NAME                  | WORK_COMPLETED | WORK_ESTIMATED |
+-----------------------------+----------------+----------------+
| stage/sql/copy to tmp table |        1000000 |         978903 |
+-----------------------------+----------------+----------------+
1 row in set (0.00 sec)

问题二:索引字段问题

过了一段时间又发现第二个问题,部分工单会触发执行 10 秒超时失败。

工单系统判断用户的改表需求,满足直接使用 ALTER TABLE 进行操作会有个 10 秒超时的兜底策略,来避免因为解析错误导致方案选择错误最终影响主从延迟。

另外,也建议带上 ALGORITHM=INPLACE, LOCK=NONE ,避免因为不是使用 inplace 导致 DML 阻塞。

这个问题排查了很久都没什么眉目,反反复复的查阅文档及测试,始终都认为这个需求一定是满足快速改表的方案。实在是想不明白到底是哪里的问题,还一度认为是 MySQL 的 Bug。

下面是一张 100w 记录表的测试用例:

> show create table tb_test\G
*************************** 1. row ***************************
       Table: tb_test
Create Table: CREATE TABLE `tb_test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `rshost` varchar(30) NOT NULL DEFAULT '1' COMMENT '主机地址',
  `cpu_info` json DEFAULT NULL COMMENT 'cpu信息 json串',
  `mem_info` json DEFAULT NULL COMMENT 'mem信息 json串, 单位是GB',
  `io_info` json DEFAULT NULL COMMENT '磁盘io使用情况, 单位是KB',
  `net` json DEFAULT NULL COMMENT '网络使用情况, 单位是KB(speed单位是MB/S)',
  `a_time` datetime NOT NULL DEFAULT '2022-01-01 00:00:00',
  PRIMARY KEY (`id`),
  KEY `idx_a_time` (`a_time`),
  KEY `idx_rshost` (`rshost`)
) ENGINE=InnoDB AUTO_INCREMENT=623506728 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

> select count(*) from tb_test;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.15 sec)

> alter table tb_test modify `rshost` varchar(31) NOT NULL DEFAULT '1' COMMENT '主机地址';
Query OK, 0 rows affected (3.61 sec)
Records: 0  Duplicates: 0  Warnings: 0

> alter table tb_test modify `rshost` varchar(32) NOT NULL DEFAULT '1' COMMENT '主机地址', ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (3.66 sec)
Records: 0  Duplicates: 0  Warnings: 0

> alter table tb_test drop index idx_rshost;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

> alter table tb_test modify `rshost` varchar(33) NOT NULL DEFAULT '1' COMMENT '主机地址', ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

> alter table tb_test modify `rshost` varchar(34) NOT NULL DEFAULT '1' COMMENT '主机地址', ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

> 

可以看到 rshost 字段有一个索引,在扩展字段的时候虽然支持 inplace,但是实际上很慢,内部应该是重建索引了,后来将索引删除后就秒改了。

针对这个场景,我们的解决方案是使用 gh-ost/pt-osc 进行改表,那么问题来了,我们应该怎么判断目标字段是否是被索引了呢?

请看下面的 SQL,information_schema.STATISTICS 记录了一个表的所有索引字段信息,可以很方便的判断某个字段是否被索引。

select * from information_schema.STATISTICS where table_schema = 'db' and table_name = 'table' and column_name = 'col';

其他问题

这个问题也是执行 10 秒超时,也就是文章开头提到的业务反馈的问题,其实跟 问题二 差不多同期,但在解决了 问题二 后还是一直找不到原因及解决方案。

关于这个问题甚至都没法复现,不像 问题二 可以方便复现,当时在业务的线上库做操作又能 100% 复现,但是将他们的表及数据单独导出来放在测试环境就不行。

在业务库上测试是选了一个从库,不记录 binlog 的方式(set sql_log_bin = 0)。虽然不建议这么做,但是实属迫不得已,在测试环境复现不出来。

后来实在找不到原因,就跳过快速改表的方案使用改表工具进行处理,后来这个事情就算不了了之了。直到前几天业务突然找我,说之前的那个表能快速改表了。我赶紧去查看了工单详情,发现确实如业务所述,这回我就更加郁闷了,难不成是见鬼了?这玩意还自带歇业窗口的嘛?

本着严谨的态度,又去测了一下。确实是可以满足快速改表了,但是原因还是找不到,这感觉真的很难受。

最后,静下来认真梳理了一下,发现了一些猫腻。下面是我的测试思路:

1. 将线上的表导出并导入到测试环境

因为表本身就几个 G,不算大就使用了 mysqldump 进行导出导入。这个操作并非 100% 复原线上的环境,有个隐藏的变量被修改了,那就是这个表被重建了,这个跟之前业务用改表工具进行修改后的操作有点类似,所以就猜想,会不会是因为这个表本身存在空洞导致的呢。

最后通过拉历史备份,还原了一个环境进行了测试,果不其然不能快速改表。为了印证了想法,就去查了一下这个表的空洞。十分遗憾,这个表并没有存在空洞(空洞只有几 MB)。这回又郁闷了,还以为要破案了,但是不管怎么样既然怀疑是重建表能解决,那就开搞。

2. 重建前的状态

业务从 varchar(300) 扩展到 varchar(500),其他属性没变更。

| 1170930999 | dba            | 192.168.1.100:47522  | dbzz_dbreport | Query            |      45 | altering table                                        | ALTER TABLE  t_recycle_express  MODIFY  address VARCHAR(500) NOT NULL DEFAULT '' COMMENT '地址', ALGORITHM=INPLACE, LOCK=NONE;             |

3. 重建后的状态

>ALTER TABLE t_recycle_express engine = innodb;
Query OK, 0 rows affected (18 min 52.60 sec)
Records: 0  Duplicates: 0  Warnings: 0

>ALTER TABLE
    ->   t_recycle_express
    -> MODIFY
    ->   address VARCHAR(500) NOT NULL DEFAULT '' COMMENT '地址';
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

活久见,还真是重建表后就能解决了!虽然很郁闷,终究是有一个解决方案了,后期我们决定对此做个优化,将满足快速改表的工单又触发十秒超时的改为使用 gh-ost/pt-osc 重新执行,以此避免业务反复提交工单,应该能大大提升好感度。

这个问题虽然知道解决方案,但是依旧不知道原因,我猜测可能是跟统计信息不准确有关系(或者约束),要是有大佬知道原因,请告知一下。

总结

MySQL Online DDL 特性给 DBA 带来了很多的便利,提升了工作效率,我们可以基于官方的理论作为指导去优化我们的系统。但是实际情况是理论知识很简单,线上环境十分复杂,可能会遇到各种意料之外的事情,任何线上的操作都要给自己留好后路做好兜底,这是十分必要的。

我们的系统,如果没有添加 10 秒超时的兜底,那势必会因为解析错误导致选了错误的改表方案,然后导致从库延迟,可能会影响线上业务,想想都有点心慌。

这里有个注意事项,针对执行超时不能简单的使用 timeout 等属性进行控制,还需要添加检查逻辑,要到数据库里面去查一下任务是否真的已经终止了。避免因为 timeout 异常导致终止信号没有给到 MySQL,这种可能会引发一系列问题,切记切记。

以上,仅供参考。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
Mysql中表字段VARCHAR(N)类型及长度的解释 本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释,主要是对字符和字节的关系的理解。 阅读详情

相关推荐

差分运放电路输出电压偏置设计解析

差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。

weixin_35750747的博客 470

数据库中char、varchar、nvarchar

Mysql中char、varchar、nvarchar

weixin_38345476的博客 700

QT编程系列1--QT学习前需知

本周学习了一些QT编程方面的知识,学写了几个程序,这里把记录下来。一方面对前面学习的知识做一个总结,便于以后复习、再学习和应用;另一方面也和大家做个交流,有不足的地方请各位看官多指点。   首先是做一些学习之前的交代:一,学习QT需要哪些基础;二,学习QT有哪些用途,QT较其他的开发工具有哪些特点;三,学习QT的思路。

霜月孤鸟&RTEMS&TinyOS 1115

关于MySQL5.7版本varchar字段宽度扩容的一些相关知识与实践

转载文章:http://blog.itpub.net/30877447/viewspace-2740189/ 关于MySQL5.7版本varchar字段宽度扩容的一些相关知识与实践 一、字段宽度的一些扩展知识 在工作中,设计业务场景时,如果设计期能明确预计到未来线上业务表行数会很多,达到千万级别以上,且可能会存在新增字段的后续操作,可以适当的设计varchar类型的预留字段(不建议但理论层面可行,请多考虑潜在的风险点),预留字段的宽度应当遵循指定区间内宽度最小的原则,相关区间和说明见下文总结: 我们根据My

leo09999的博客 3093

WOFOST模型参数调优实战:从‘跑不通’到‘预测准’的避坑指南

本文详细介绍了WOFOST模型参数调优的实战技巧,帮助用户从模型报错诊断到参数敏感性分析,再到土壤-作物参数联调策略,逐步解决‘跑不通’到‘预测准’的问题。通过Python和PCSE工具,提供参数扰动测试模板和关键参数优先级矩阵,助力作物模型的高效校准与预测。

weixin_32597009的博客 621

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

mysql存储函数 参数 varchar 报错问题

Mysql  Navicat  中声明存储函数如果报如下错误,应该是你传入的varchar参数没有声明长度所导致的。加上长度即可。     这样就解决了错误  

Fuzz 4656

别再手动更新Excel了!用Jira看板管理你的个人项目(附保姆级配置流程)

本文详细介绍了如何利用Jira看板替代Excel进行个人项目管理,提供从注册到配置的保姆级教程。通过极简看板模式、自动化规则和数据分析功能,帮助用户实现任务可视化、协作高效化和提醒自动化,大幅提升个人工作效率。特别适合需要管理复杂个人项目的用户。

weixin_42699679的博客 228

MYSQL 遇到的坑---MAX()函数对 varchar 类型没用

解决办法 SELECT MAX(field+0) FROM tablename

qq_37322804的博客 1370

基于STFT和卷积神经网络的时序数据分类

我们提供了相应的代码和数据,读者可以直接运行并尝试在自己的数据集上进行分类实验。在本文中,我们将介绍一种基于短时傅里叶变换(STFT)和卷积神经网络(CNN)的时序数据分类方法。我们将提供可直接运行的代码和数据,以帮助读者理解和实现这一方法。STFT可以提取信号的频谱信息,有助于捕捉时序数据中的关键特征。在这个例子中,我们将使用一个简化的手势识别数据集作为示例。在这段代码中,我们使用Adam优化器和稀疏分类交叉熵损失函数进行模型的编译。然后,我们使用训练集进行模型的训练,同时使用测试集进行模型性能的验证。

CodeWOW的博客 694

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 239

MySQL Max()函数的坑

MySQL Max()函数的坑 引言 在MySQL种,varchar的字段使用MAX函数进行取最大值查询时,发现取到的值始终是9,不论是否多少最终取到都是9. 原因是max() 是对数字类型求最大,而varchar 则会出现异常。 -- varchar 需要先转型在用max() SELECT MAX(CAST(code AS UNSIGNED)) AS code FR...

加了白糖的老干妈 3万+

mongodb在游戏开发领域的优势

目前游戏服务器使用mysql作为数据库的较多,然而,使用mongodb来作为存储层,在某些方面比mysql更为方便和适合。

littleschemer的博客 1698

数据库 varchar 最大长度

但是,需要注意的是,实际可用的最大长度取决于数据库的配置和硬件限制。的长度是字节,也就是说,最大支持 4000 字节,db2 中 UTF-8 一个中文就要占 3 个字节,GBK 一个中文占 2 字节。类型的长度是固定的,如果存储的数据长度小于定义的长度,那么它将会在右侧填充空格。最大支持 255 字节,插入时如果字符串的长度大于设定的长度,不会报错,会插入一个空串。同 pg,最大 10485761,可以不设置,不设置就是最大。最大 8000 字节,可以不设定长度,默认为 1 字节。

qq_55968769的博客 2999

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MySQL扩展varchar类型长度的问题场景

无论Oracle还是MySQL,都支持这种varchar/varchar2的数据类型,但是不当的使用可能产生相应的问题,值得关注,相关历史文章,《Oracle 19c对VARCHAR2的限制》《小白学习MySQL - varchar类型字段为什么经常定义成255?》《为什么日期不建议使用VARCHAR2或者NUMBER?》《支持超过4000字节的varchar2类型》技术社群的这篇文章《故障分析 ...

bisal的专栏 401

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mysql中varchar存储的长度

是一种可变长度的字符数据类型,用于存储可变长度的字符串。它的特点是可以根据实际存储的字符串长度动态分配存储空间,从而节省存储空间。与固定长度的字符数据类型相比,varchar 更加灵活,可以适应不同长度的字符串存储需求。在 MySQL 中,varchar 的长度可以在创建表时指定,最大长度为 65535 个字符。​。

1868

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MySQL 更改 varchar 列长度需注意的事

MySQL 更改varchar 列长度需要注意的事

Tony_stark_L的博客 3386

MySQL的varchar类型长度设置为多少合适?

点击标题下「蓝色微信名」可快速关注无论是Oracle数据库还是MySQL数据库,varchar数据类型还是有很多讲究的,如果用的不对,就可能产生一些影响,所以要了解清楚它的原理和场景,才能正确使用。相关历史文章,《MySQL扩展varchar类型长度的问题场景》《Oracle 19c对VARCHAR2的限制》《小白学习MySQL - varchar类型字段为什么经常定义成255?》《为什么日期不建...

bisal的专栏 1055

mysql varchar可存储的汉字长度

1、不同编码中汉字占用的字节 字节,计量存储容量的计量单位之一,通常情况下:1字节bytes = 8位bits。 字符,计算机中使用的字母、数字、字和符号等。 编码 一个英文字母占用的字节 一个中文汉字占用的字节 ASCII 码 1 2 Unicode 1 2 符号 1 2 UTF-8 1 3 UTF-16 2 2(unicode扩展区的一些汉字存储需要4个字节) UTF-32 4 4 2、mysql varchar(100)能存的汉字数 这和mysql的版本有关系

槿的博客 1万+

varchar 字段扩展问题

当前字符集类型为 UTF8MB4,由于 UTF8MB4 为四字节编码字符集,即一个字节长度可存储 63.75(255/4)个字符,所以当我们将 VARCHAR(63) 修改为 VARCHAR(64) 时,需要增加一个字节去进行数据的存储,就要通过建立临时表的方式去完成本次长度扩容,故需要花费大量时间。如果是从 < 64 的长度扩展到 >64 的长度,则不能秒级扩展,因为改变了数据库的存储结构。规则2:如果是从 < 64 的长度扩展到 >64 的长度,则不能秒级扩展。所以定期对大表做整理还是很有必要的。

青春作伴,爱情最好 726

mysql中char和varchar的区别

char和varchar都是用于在数据库中存储字符串的数据类型。它们之间的主要区别在于存储空间的使用方式。

蒾酒的博客 1951

mysql varchar按字节_Mysql varchar 长度是字节还是字符

关于varchar的长度是字节还是字符本人查阅很多文档发现他们写的都是字节长度,但是经过实践表明那个长度指的是能放下的字符串的个数varchar(255) 表示最多可以放255个字符,不论是中文还是英文。注:version 4版本之前是按字节下面再来扩展一点知识:在5.0以上的MySQL版本中varchar的最长的长度是65535字节,其最大长度受限于最大行长度(max row size 6553...

weixin_29251337的博客 2628

mysql设置varchar_MySQL动态修改varchar长度的方法

虽然这种情况不应该发生,通常像我们关系型数据库,我们应该是事先设计好,以后不能改动,但是由于之前工作的疏忽,其实说实话,也不仅仅是我个人的疏忽,主要是沟通上的原因,当然数据库毕竟是我设计的,所以,还是自我批评一下。说一下情况:MySQL字段有个varchar值字段设置的太短了,设置了30个,(我依稀记得varchar是可扩展的,当然现实并不容忍我的依稀),所以我只能找一个方法在保证数据库数据不变的...

weixin_30308101的博客 1477

MySQL online DDL 更改Varchar的字段长度

背景 修改Varchar 的大小的时候。不用锁表,就可以进行操作DDL。这个还得具体查看版本,还有具体情况。下来我们来看一下INnoDB中的Online DDL各个操作请求。 mysql 在DDL 权威指南 5.6 官方文档 :verision :https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html 5.7 官方文档 : https://dev.mysql.com/doc/refman/5.7/en/innod

weixin_40413961的博客 3356

关于MySQL VARCHAR的错误经验,你中了几条?

在项目的技术设计评审中,大家关于MySQLVARCHAR字段的最佳使用,发生了一些分歧和和讨论。事后,特意针对MySQL中VARCHAR类型的使用进行了整理,在此过程中才发现,某些曾经认为的最佳实践和经验,随着MySQL的版本迭代已经不复存在,甚至存在一些错误的“幻觉常识”。这篇文章将MySQL的VARCHAR使用中常见的“幻觉常识”,进行分析和整理,看看在你的经验中,有多少已经是过时的,甚至是错误的?

jcc4261的博客 983

mysql 最大长度_mysql VARCHAR的最大长度到底是多少

以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的不过后来群里有人给了解释,突然才发现原来事情不是这么简单MYSQL COMPACT格式,每条记录有一个字节来表示NULL字段分布,如果表中有字段允许为空,则最大只能定到65532,如果没有字段允许为空,则那个字节可以节省,最大可以定义到65533,不知道是不是这个原因于是上网看了些资料,又在本地做了些实...

weixin_35544017的博客 2140
上一篇: MySQL 核心模块揭秘 | 05 期 | 读事务和只读事务的变形记
下一篇: SQL 审核神器 SQLE 专业版全新上线,永久免费!
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值