OceanBase 特殊的 INT 与时间类型隐式转换问题

JDBC实战避坑指南:驱动加载、URL解析与连接池真相 JDBC是Java应用访问数据库的基础技术,其核心在于驱动注册机制、连接URL协议解析和连接资源管理。从JDBC 4.0起,SPI服务发现取代了脆弱的Class.forName()显式加载,但ClassLoader隔离问题仍导致常见ClassNotFoundException;MySQL 8+与OceanBase等国产数据库的JDBC URL参数(如useSSL、serverTimezone、loadbalance)并非可选配置,而是直接影响连接建立、时区转换与高可用路由的关键控制项;而DataSource 阅读详情

本文作者分享了Oceanbase时间与数值类型隐式转换导致查询结果不符合预期或“不正确”问题的排查思路。

作者:任仲禹

爱可生 DBA 团队成员,擅长故障分析和性能优化,文章相关技术问题,欢迎大家一起讨论。

本文来源:原创投稿

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

之前在 OceanBase 使用中碰到了一个“令人费解”的数据类型隐式转换问题。结论比较简单,特跟大家分享下排查思路。

问题描述

某客户项目组执行更新 SQL 语句时会偶发失败,报错如下:

脱敏处理后

ERROR bad SQL grammar [update renzy set at=current_timestamp,expire_at=(cast(unix_timestamp(current_timestamp(3) as unsigned) +?)), order_id= ? where id = ? and (expire_at < current_timestamp or order_id = ?)] java.sql.SQLSyntaxErrorException: (conn=1277168) Incorrect value.

查询 OceanBase 版本。

./observer -V

observer (OceanBase 3.2.3.2)
REVISION: 105000092022092216-445151f0edb502e00ae5839dfd92627816b2b822

查看表结构和数据。

MySQL [test]> show create table renzy\G
*************************** 1. row ***************************
       Table: renzy
Create Table: CREATE TABLE `renzy` (
  `id` varchar(64) NOT NULL,
  `at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `order_id` varchar(64) NOT NULL,
  `expire_at` bigint(20) NOT NULL,
  `vt` timestamp NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0

MySQL [test]> select * from renzy;
+----+---------------------------+---------------+------------+---------------------------------+
| id | at                  | order_id      | expire_at  | vt                  |
+----+---------------------------+---------------+------------+---------------------------------+
| 1  | 2023-07-07 14:57:13 | 0:16632@172.1 | 1716040750 | 2023-07-07 14:57:13 |
+----+---------------------------+---------------+------------+---------------------------------+
1 row in set (0.02 sec)

问题排查

问题 1:报错语句

直接执行报错的 SQL 语句。

update renzy  set at=CURRENT_TIMESTAMP, expire_at=(cast(unix_timestamp(current_timestamp(3)) as unsigned) + 30000000), order_id= '0:16632@172.24.64.1'  where id = '1'  and (expire_at < CURRENT_TIMESTAMP  or order_id = '0:16632@172.24.64.1')

ERROR 1292 (22007): Incorrect values.

问题 2

但是,当主键 ID 匹配不到任何数据,UPDATE 语句将不会报错。

为啥?先记录下问题接着看日志。

# 表不存在 id=2 的数据
update renzy  set acquired_at=CURRENT_TIMESTAMP, expire_at=(cast(unix_timestamp(current_timestamp(3)) as unsigned) + 30000000), order_id= '0:16632@172.24.64.1'  where id = '2'  and (expire_at < CURRENT_TIMESTAMP  or order_id = '0:16632@172.24.64.1')

Query OK.

报错 SQL 的 sql_auit 输出和日志

带着问题分析下 sql$gv_audit 输出,得出如下信息:

  • 该语句计划是本地计划,分发到了 0.71 节点。
  • 错误码是 4219 (无效的 datetime 值)。
MySQL [oceanbase]> select trace_id,svr_ip,ret_code,retry_cnt,usec_to_time(request_time),elapsed_time,execute_time,plan_type,query_sql from gv$sql_audit where query_sql like 'update id%' and ret_code != 0 order by request_time desc  limit 5;

+-----------------------------------+-------------+----------+-----------+----------------------------+--------------+--------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| trace_id                          | svr_ip      | ret_code | retry_cnt | usec_to_time(request_time) | elapsed_time | execute_time | plan_type | query_sql                                                                                                                                                                                                                                                                               |
+-----------------------------------+-------------+----------+-----------+----------------------------+--------------+--------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| YB420CF10047-0005FBCCEF6E3635-0-0 | 12.241.0.71 |    -4219 |         0 | 2023-06-06 15:32:08.375051 |          689 |          611 |         1 | update id  set acquired_at=CURRENT_TIMESTAMP, expire_at=(cast(unix_timestamp(current_timestamp(3)) as unsigned) + 30000000), order_id= '0:16632@172.24.64.1'  where id = '2'  and (expire_at < CURRENT_TIMESTAMP  or order_id = '0:16632@172.24.64.1') |
·····
5 rows in set (5.21 sec)

关键报错日志

0.72 的 obs.log。

#grep YB420CF10047-0005FBCCEF6E3635-0-0 observer.log.20230606153309

[2023-06-06 15:32:08.375202] WARN  [LIB.TIME] int_to_ob_time_with_date (ob_time_convert.cpp:1618) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=5] [dc=0] datetime is invalid or out of range(ret=-4219, int64=0)

[2023-06-06 15:32:08.375211] WARN  [LIB.TIME] int_to_datetime (ob_time_convert.cpp:329) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=8] [dc=0] failed to convert integer to datetime(ret=-4219)

[2023-06-06 15:32:08.375214] WARN  [SQL] common_int_datetime (ob_datum_cast.cpp:709) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=3] [dc=0] int_datetime failed(ret=-4219)

[2023-06-06 15:32:08.375219] WARN  [SQL] int_datetime (ob_datum_cast.cpp:2076) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=4] [dc=0] fail to exec common_int_datetime(expr, in_val, ctx, res_datum)(ret=-4219, in_val=1716036728)

[2023-06-06 15:32:08.375223] WARN  [SQL] get_comparator_operands (ob_expr_operator.h:1131) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=4] [dc=0] left eval failed(ret=-4219)

[2023-06-06 15:32:08.375227] WARN  [SQL.ENG] def_relational_eval_func (ob_expr_cmp_func.cpp:54) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=4] [dc=0] failed to eval args(ret=-4219)

[2023-06-06 15:32:08.375232] WARN  [SQL.ENG] calc_or_exprN (ob_expr_or.cpp:221) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=5] [dc=0] eval arg 0 failed(ret=-4219)

[2023-06-06 15:32:08.375240] WARN  [SQL.ENG] filter_row (ob_operator.cpp:915) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=7] [dc=0] expr evaluate failed(ret=-4219, expr=0x7f37808ec058)

[2023-06-06 15:32:08.375247] WARN  [STORAGE] check_filtered (ob_multiple_merge.cpp:1249) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=7] [dc=0] filter row failed(ret=-4219)

[2023-06-06 15:32:08.375251] WARN  [STORAGE] process_fuse_row (ob_multiple_merge.cpp:787) [38763][0][YB420CF10047-0005FBCCEF6E3635-0-0] [lt=3] [dc=0] fail to check row filtered(ret=-4219)

观察到最开始抛出错误的是 int_to_ob_time_with_date 方法,报的错是 “datetime is invalid or out of range(ret=-4219, int64=0)”,即值无效或超过范围。

这里 UPDATE 的调用链路是:

common_int_datetime -> int_to_datetime -> int_to_ob_time_with_date

问题 3:尝试使用 SELECT 查询结果

表中 EXPIRE_AT 存储的是未来时间(1716040750),与当前时间(1686042749)做比较,查询结果理应不输出结果才对?(先记录为问题 3:查询结果不符合预期)

# 表中只有 1 行记录,且 EXPIRE_AT 的值为 1716040750
MySQL [mock_db]> select * from renzy where EXPIRE_AT < CURRENT_TIMESTAMP;

+-------+---------------------+---------------------+------------+------------------------------------+
| id | ACQUIRED_AT         | order_id            | EXPIRE_AT  | LST_UP_TM          |
+-------+---------------------+---------------------+------------+------------------------------------+
| 1 | 2023-06-06 16:39:10 | 0:16632@172.24.64.1 | 1716040750 | 2023-06-06 16:39:10 |
+-------+---------------------+---------------------+------------+------------------------------------+

1 row in set (0.05 sec)

# 当前时间戳
MySQL [mock_db]> select unix_timestamp(CURRENT_TIMESTAMP);

+--------------------------------------------+
| unix_timestamp(CURRENT_TIMESTAMP) |
+--------------------------------------------+
|                        1686042749 |
+--------------------------------------------+

1 row in set (0.03 sec)

SELECT 查询的报错日志。

[2023-06-06 17:08:54.307371] WARN  [LIB.TIME] int_to_ob_time_with_date (ob_time_convert.cpp:1618) [38763][0][YB420CF10047-0005FBCCEF6F9E6D-0-0] [lt=10] [dc=0] datetime is invalid or out of range(ret=-4219, int64=0)

[2023-06-06 17:08:54.307382] WARN  [LIB.TIME] int_to_datetime (ob_time_convert.cpp:329) [38763][0][YB420CF10047-0005FBCCEF6F9E6D-0-0] [lt=10] [dc=0] failed to convert integer to datetime(ret=-4219)

这里 SELECT 的调用链路:int_to_datetime -> int_to_ob_time_with_date

以上就是存疑的几个问题,那在具体分析前,先了解一下前置知识点:OceanBase 的隐式转换。

OceanBase 的隐式转换

数据类型 bigint 与 datetime 的值是没法直接比较,需要先将 int 转换为时间类型,这就是所谓的隐式转换,所以这里 OceanBase 是如何转很重要。

  • int 类型转换成 OceanBase 认可的时间类型(即 OBTime)并不是用的 from_unixtime 这个函数,而是用的 OceanBase 自己内部的逻辑。

  • 源码中涉及 int,double,string 类型隐式转换的逻辑如下:

int_to_datetime
////////////////////////////////
// int / double / string -> datetime / date / time / year.
int ObTimeConverter::int_to_datetime(int64_t int_part, int64_t dec_part,
                                     const ObTimeConvertCtx &cvrt_ctx, int64_t &value,
                                     const ObDateSqlMode date_sql_mode)
{
  int ret = OB_SUCCESS;
  dec_part = (dec_part + 500) / 1000;
  if (0 == int_part) {
    value = ZERO_DATETIME;
  } else {
    ObTime ob_time(DT_TYPE_DATETIME);
    ObDateSqlMode local_date_sql_mode = date_sql_mode;
    if (cvrt_ctx.is_timestamp_) {
      local_date_sql_mode.allow_invalid_dates_ = false;
    }
    if (OB_FAIL(int_to_ob_time_with_date(int_part, ob_time, false, local_date_sql_mode))) {
      LOG_WARN("failed to convert integer to datetime", K(ret));
    } else if (OB_FAIL(ob_time_to_datetime(ob_time, cvrt_ctx, value))) {
      LOG_WARN("failed to convert datetime to seconds", K(ret));
    }
  }
  value += dec_part;
  if (OB_SUCC(ret) && !is_valid_datetime(value)) {
    ret = OB_DATETIME_FUNCTION_OVERFLOW;
    LOG_WARN("datetime filed overflow", K(ret), K(value));
  }
  return ret;
}

最终调用的 int_to_ob_time_with_date:

////////////////////////////////
// int / uint / string -> ObTime / ObInterval <- datetime / date / time.

int ObTimeConverter::int_to_ob_time_with_date(int64_t int64, ObTime &ob_time, bool is_dayofmonth,
                                              const ObDateSqlMode date_sql_mode)
{
  int ret = OB_SUCCESS;
  int32_t *parts = ob_time.parts_;
  if (is_dayofmonth && 0 == int64) {
    parts[DT_SEC]  = 0;
    parts[DT_MIN]  = 0;
    parts[DT_HOUR] = 0;
    parts[DT_MDAY] = 0;
    parts[DT_MON]  = 0;
    parts[DT_YEAR] = 0;
  } else if (int64 < power_of_10[2]) {
    ret = OB_INVALID_DATE_VALUE;
    LOG_WARN("datetime integer is out of range", K(ret), K(int64));
  } else if (int64 < power_of_10[8]) {
    // YYYYMMDD.
    parts[DT_MDAY]  = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_MON]  = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_YEAR] = static_cast<int32_t>(int64 % power_of_10[4]);
  } else if (int64 / power_of_10[6] < power_of_10[8]) {
    // YYYYMMDDHHMMSS.
    parts[DT_SEC]  = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_MIN]  = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_HOUR] = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_MDAY] = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_MON]  = static_cast<int32_t>(int64 % power_of_10[2]); int64 /= power_of_10[2];
    parts[DT_YEAR] = static_cast<int32_t>(int64 % power_of_10[4]);
  } else {
    ret = OB_INVALID_DATE_VALUE;
    LOG_WARN("datetime integer is out of range", K(ret), K(int64));
  }
  if (OB_SUCC(ret)) {
    apply_date_year2_rule(parts[0]);
    if (OB_FAIL(validate_datetime(ob_time, is_dayofmonth, date_sql_mode))) {
      LOG_WARN("datetime is invalid or out of range", K(ret), K(int64));
    } else if (ZERO_DATE != parts[DT_DATE]) {
      parts[DT_DATE] = ob_time_to_date(ob_time);
    }
  }
  return ret;
}

上面代码表示 OceanBase 仅能识别的格式:

  • YYYYMMDD
  • YYYYMMDDHHMMSS

一旦不是上述格式就会抛出报错。下图可以看到只有 20230816 和 20230819111111 两种符合条件。

问题原因

问题 3:SELECT 查出的结果不符合预期

bigint 与 datetime 类型"比较"涉及隐式转换导致结果不可预知。

  • select * from renzy where EXPIRE_AT < CURRENT_TIMESTAMP; 中 EXPIRE_AT 的值是 bigint 类型,且值为 1716040750。
  • 值 1716040750 无法匹配 int_to_ob_time_with_date 规定的格式,将抛出告警“datetime integer is out of range”,日志中也能印证这一点。
  • 这里按理应该在 SQL 执行时抛出报错,不应该输出结果的,但是为了 OB 兼容 MySQL 而选择输出了“错误”的值。
    • 为啥 MySQL 不会报错? MySQL 中转换失败之后,其实会有默认值 0,上述 OB 行为转换失败用的默认值,应该和 MySQL 兼容,所以满足了 WHERE 条件 0 < 1686042749,SELECT 就输出了结果。

问题 1:UPDATE 语句为何能吐出报错

  • 因为 OB 默认开启了 SQL_MODE 严格模式,如果发生隐式转换且转换失败(用了默认值)的场景,OB 的严格模式比 MySQL 做了一层防范,将禁止 SQL 执行。
  • MySQL 开启 SQL_MODE 严格模式下能执行“成功”。

问题 2:UPDATE 语句 WHERE 条件中主键匹配到不存在的值不报错

  • UPDATE 走的是 table get 算子,等值查询不到结果后,不需要再 filter 后面的条件。这解释了项目组偶发失败的问题。

最后一个问题:为啥 UPDATE 直接报错,SELECT 确能查出“错误的值”

此报错仅抛出报错到 obs.log。

我这边猜测是因为只在 UPDATE 的时候会遵循严格模式,而 SELECT 则不需要遵循,依据前文提到的调用链路:

  • UPDATE: common_int_datetime -> int_to_datetime -> int_to_ob_time_with_date
  • SELECT: int_to_datetime -> int_to_ob_time_with_date

UPDATE 多了上层的 common_int_datetime,调用入口不一样,而根据这个方法,大致猜测是因为 SQL_MODE 的严格模式导致。

验证下猜想,看起来清空 SQL_MODE 后,UPDATE 果然能插入成功。

MySQL [test]> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                        |
+--------------------------------------------+
| STRICT_ALL_TABLES,NO_ZERO_IN_DATE |
+--------------------------------------------+
1 row in set (0.01 sec)

MySQL [test]> update renzy  set at=CURRENT_TIMESTAMP, expire_at=(cast(unix_timestamp(current_timestamp(3)) as unsigned) + 30000000), order_id= '0:16632@172.24.64.1'  where id = '1'  and (expire_at < CURRENT_TIMESTAMP  or order_id = '0:16632@172.24.64.1');
ERROR 1292 (22007): Incorrect value

MySQL [test]> set sql_mode='';
Query OK, 0 rows affected (0.01 sec)

MySQL [test]> update renzy  set at=CURRENT_TIMESTAMP, expire_at=(cast(unix_timestamp(current_timestamp(3)) as unsigned) + 30000000), order_id= '0:16632@172.24.64.1'  where id = '1'  and (expire_at < CURRENT_TIMESTAMP  or order_id = '0:16632@172.24.64.1');
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

可能我的猜测有问题,但个人能力有限,欢迎大家一起指正和讨论。

结论

  1. 让客户项目组改写 SQL 逻辑。

    • EXPIRE_AT < CURRENT_TIMESTAMP 改成

    • EXPIRE_AT < unix_timestamp(CURRENT_TIMESTAMP)

  2. 强调 SQL 规范,避免隐式转换。

    关于 SQLE

    爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 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-cn/3.modules/3.7_auditplugin/auditplugin_development.html
SeekDB混合搜索数据库:统一向量+标量+地理查询的AI原生引擎 混合搜索是一种将向量相似度、全文检索、结构化条件与地理空间查询深度融合的现代数据检索范式。其核心原理在于打破模态割裂,通过统一存储引擎、多索引协同剪枝与联合代价模型,实现跨数据类型的原子化查询执行。技术价值体现在消除AI应用中常见的‘胶水层陷阱’,显著降低RAG系统复杂度,并提升端到端召回率与响应确定性。典型应用场景包括智能知识库、多条件推荐引擎、金融风控文档检索及医疗专家匹配系统。SeekDB作为OceanBase推出的开源混合搜索数据库,以SQL原生支持VECTORIZE函数、HNSW+倒排+B+树+R 阅读详情

相关推荐

【软考】中级 | 数据库系统工程师 | 核心考点与实战应用精讲

本文深入解析软考中级数据库系统工程师考试的核心考点与实战应用,涵盖数据库设计、SQL优化、性能调优等关键内容。通过系统化的知识框架和实际案例分析,帮助考生高效备考并掌握数据库系统工程师的核心技能,提升职业竞争力。

weixin_34259232的博客 374

关于OceanBase 的int类型问题

OceanBase 到目前为止,最新版本为0.4,其int类型实现,底层均采用int64来存储,二进制的结构如下: [len][数值] 如:128 的实际存储为:16进制显示:01 80  其中01为长度,占用1字节,80即10进制的128 优点: 在schema中,只要是数值类型(非小数),全部定义成int类型.  管理较少的数据类型,DBA、开发都比较轻松。

wantong2005的专栏 1971

多维聚合实战:超越GROUP BY的数据操作指南

多维聚合是BI与数据分析中支撑销售看板、用户漏斗、IoT时序分析等场景的核心技术,其本质并非简单叠加GROUP BY,而是构建可预测的维度空间并保障聚合一致性。它涉及维度建模、空值穿透、ROLLUP/CUBE/GROUPING SETS选型、JOIN对齐及零值补全等关键原理,技术价值在于实现准确、稳定、可审计的交叉分析结果。典型应用场景包括多维报表生成、自助分析下钻、实时风控聚合及AI特征工程。本文聚焦真实生产环境中的数据操作实践,深入解析维度标准化、全组合空间构建、聚合校验与性能优化等环节,尤其强调多维聚

ateu52935的博客 464

JavaSE Day4 知识总结

程序控制流程 |--顺序 |--选择 |--循环

qq_57542248的博客 287

倍福--触摸屏读写Time类型参数

PLC程序中需要加延时,希望在触摸屏上面能能够修改延时,本文介绍器从触摸屏修改延时的方案。 操作流程 1.1. PLC程序 PLC方面主要用到了INT_TO_TIME做类型转换,触摸屏输入的时INT类型,程序中转化为TIME类型即可,其中100对应100ms因此能够在触摸屏中改变数值精准做到延时调整,程序如下所示 1.2. 威伦触摸屏设计 威伦触摸屏只需要定义一个数值输入控件并关联地址即可,如下所示 ......

weixin_41883890的博客 2781

OceanBase数据库:日期处理、比较以及转换全面指南

OceanBase数据库支持多种日期时间数据类型,包括DATE、TIME、DATETIME、TIMESTAMP和YEAR,每种类型有特定的格式、范围和特性。DATETIME与TIMESTAMP的主要区别在于时区支持,TIMESTAMP会进行时区转换。日期比较遵循时间先后原则,可通过运算符或BETWEEN实现范围查询。为提高性能,建议为日期列创建索引、使用分区策略,并避免在索引列上使用函数。TIMESTAMP类型的比较会考虑时区因素,而DATETIME不会。通过合理设置SQL Mode可以控制数据库对无效日期

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1085

sql server 到 oceanbase(ob) 之间的转换

OceanBase: DATE, TIME, TIMESTAMP(DATETIMEOFFSET 类型在 OceanBase 中没有直接对应,可能需要转换为 TIMESTAMP)OceanBase: CHAR, VARCHAR, CLOB(OceanBase 支持 UTF-8 编码,因此使用相同的类型)OceanBase: CHAR, VARCHAR, CLOB(TEXT 类型在 OceanBase 中被 CLOB 替代)OceanBase: CHAR(36)(通常用于存储 GUID 的字符串表示)

2501_92568464的博客 768

OceanBase数据库:数据类型(数值、日期、字符、JSON等数据类型)详解

OceanBase数据库数值类型系统解析 摘要:OceanBase提供完整的数值类型系统,包括整数类型(TINYINT、INT等)、定点类型(DECIMAL)、浮点类型(FLOAT/DOUBLE)和Bit-Value类型。整数类型采用固定存储,适合计数器场景;DECIMAL确保精确计算,适用于金融领域;浮点类型遵循IEEE标准,适合科学计算。文章详细解析了各类型的技术规格、使用场景和注意事项:整数类型需合理选择范围,DECIMAL提供高精度计算,浮点类型需注意精度损失问题,特别强调应避免直接比较浮点数。最后

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1339

OceanBase 自增列进化及最佳实践

今天整理了一篇和数据库中自增列(auto increment column)相关的小文,希望感兴趣的老师们在阅读之后能够有所收获~

2501_92049521的博客 1098

【信息科学与工程学】【数据中心】【智算中心】 第二十六篇 计费系统篇01

​精准性​:MFU系数实现“算力即服务”,避免粗粒度计费不公平​灵活性​:规则引擎支持动态策略(如突发流量溢价)​可信性​:区块链存证 + 国密加密保障计费不可篡改​国产化​:全栈适配国产芯片/数据库/加密算法​创新计费模式​MFU阶梯激励​:MFU>60%时单价降低,鼓励高效编程​碳积分抵扣​:绿色计算(PUE<1.2)奖励免费算力。

weixin_49199313的博客 1801

如何设计ADAS系统功能状态机(一)

状态机模块在自动驾驶系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。今天我们来聊聊如何设计自动驾驶系统的状态机。

supass2018的博客 1615

避坑指南:OceanBase数据迁移中那些没人告诉你的细节问题

本文深入探讨了OceanBase数据迁移中的关键细节问题,包括字符集陷阱、性能优化策略和网络韧性设计。通过实战案例和详细代码示例,帮助开发者规避常见错误,提升迁移效率和数据一致性,特别适合需要进行大规模数据迁移的技术团队参考。

n2o3p4的博客 435

编码约定的自由度:重新思考Hamming码在实际工程中的灵活应用

本文探讨Hamming码在实际工程中的灵活应用,突破标准实现的思维定式。通过分析不同编码约定的优缺点和资源受限环境下的设计权衡,展示如何根据嵌入式系统、通信协议等具体需求定制汉明码实现,优化编解码效率并降低硬件开销。

perl8的博客 178

从MySQL到Oracle无缝迁移:OceanBase多模式兼容实战指南

你是否正面临数据库迁移的两难选择?既要保持业务连续性,又要应对不同数据库间的语法差异?本文将通过**真实迁移场景**,详解如何利用OceanBase的多模式兼容特性,实现从MySQL到Oracle的平滑过渡,让你在15分钟内掌握核心迁移技巧。 读完本文你将获得: - MySQL与Oracle语法差异的对比清单 - 零停机迁移的实操步骤 - 迁移后性能优化的3个关键技巧 - 官方工具链的最佳使用指...

gitblog_00481的博客 514

在Ansys Mechanical中对磨损进行建模

在有限元分析中,磨损是通过移动接触表面上的节点来复制材料侵蚀来建模的。仿真迭代更新几何,并在每次更新后重新计算平衡,使过程成为非线性的。Ansys使用将压力、相对运动和材料阻力与表面损失联系起来的经验定律来处理连续介质尺度的磨损。要在Ansys Mechanical中激活磨损建模,必须使用TB,WEAR命令定义专用材料模型。该命令与 TBDATA 相结合,允许用户输入与磨损相关的材料常数,以控制磨损的计算方式以及在接触表面上的应用方式。

jkh920184196的博客 2627

html2canvas 返回的toDataURL()数据为 data:,的解决方法

html2canvas 返回的toDataURL()数据为 data:,的解决方法 我在使用html2canvas的使用, 发现toDataURL() 返回的数据为data:, 而且将数据设置为img的src属性,图片也不能正常显示,我尝试了很多方法,也没有解决出来,经过我不断的百度+自己尝试,终于解决了这个问题。 代码: 这段代码是没有任何问题的,标准html2canvas的demod代码,但就是无法正常将图片previewImg 渲染出来,dataURL 我打印的结果为 data:, 错误的原因是,

java123_PB的博客 5024

Flink CDC OceanBase 连接器:企业级实时数据同步的3个关键实践

- 问题反馈:通过 GitHub Issues 提交问题 - 技术交流:参与社区讨论和技术分享 通过本文的详细解析,您已经掌握了 Flink CDC OceanBase 连接器的核心原理、配置方法和最佳实践。在实际应用中,建议结合具体业务场景进行参数调优,并充分利用 Flink CDC 的监控和告警功能,确保数据同步任务的稳定运行。

gitblog_00661的博客 467

BurpSuite+安卓模拟器双保险:避开真机抓包限制的完整配置指南

本文详细介绍了如何通过BurpSuite与安卓模拟器(如雷电、夜神)协同工作,绕过真机抓包限制的完整配置指南。从环境准备、网络拓扑配置到证书部署和流量分析,提供了一套高效的解决方案,帮助安全测试人员稳定捕获手机数据包,提升测试效率。

Apple的专栏 438

社区周报 | 行业文章推荐及社区动态!

欢迎来到爱可生开源社区周报!在这里为大家分享精选数据库行业文章,社区活动和开源项目的最新动态。欢迎更多的数据库爱好者能在社区结识志同道合的朋友,一起学习、探索和分享数据库相关的知识和经验,使用并参与到我们的开源项目中来!一个有深度的 MySQL 开源社区。

ActionTech的博客 313

基于Python的二手奢侈品电商平台商品保值率数据爬取与分析

本文旨在探讨如何利用Python网络爬虫技术获取二手奢侈品电商平台商品数据,并通过数据分析研究奢侈品的保值率特性。研究将使用最新的爬虫技术(包括Playwright、异步处理和数据清洗技术)来高效获取数据,并利用Pandas、Matplotlib等数据分析库进行深入的数据可视化分析。本文详细介绍了爬虫的设计思路、实现过程以及数据分析方法,为奢侈品投资和消费提供数据参考。关键词:Python爬虫、奢侈品保值率、数据分析、Playwright、异步处理。

2201_76125261的博客 511

课题申报书成功率提升85%!借助大模型AI精准选题、搭综述框架及提炼创新点(附实操AI提示词)

写一份高质量的课题申报书往往面临许多困难,对很多同仁来说,难就难在:选题既要新又要能落地,文献综述要结构清晰还得有观点,研究目标要写得有逻辑还不能夸大,创新点必须得新。而且就算你有思路,也卡在怎么组织语言,怎么压缩字数上。现在我们用ChatGPT等AI工具,可以帮我们从“选题策划 → 综述撰写 → 目标拆解 → 创新提炼 → 团队结构”实现申报工作的全流程,我们要做的就是设计好提示词和收集相关资料。这篇文章将会从申报工作的六个核心模块出发,并给出参考AI提示词,帮你快速提升课题申报效率。

智能AI让学术科研更容易 906

从理论到实践:Accelerating-CNN-with-FPGA项目中的并行计算与流水线设计终极指南 [特殊字符]

想要实现**卷积神经网络(CNN)**的**FPGA加速**,获得超过50倍的性能提升吗?本文将深入解析Accelerating-CNN-with-FPGA项目中的核心**并行计算**与**流水线设计**技术,带你从理论到实践全面掌握**FPGA加速CNN**的关键策略。无论你是FPGA初学者还是希望优化深度学习推理速度的开发者,这篇完整指南都将为你提供实用的优化思路和实现方法。 ## 🔥 为

gitblog_00091的博客 769

100天精通Oracle-实战系列(第14天)Veritas NetBackup(NBU) 配合 RMAN 脚本备份 Oracle 数据库

100天精通Oracle-实战系列(第14天)Veritas NetBackup(NBU) 配合 RMAN 脚本备份 Oracle 数据库

LuciferLiu_DBA 1992

Oracle 迁移实战:从评估到上线全流程,附避坑指南!

Oracle 迁移失败率高达 50%!本文深入探讨 Oracle 数据库迁移到国产数据库的完整实战流程,包括兼容性评估、迁移工具链选型、存储过程改造、数据同步方案、双轨运行机制、回滚策略设计。通过 某金融企业 Oracle 去 IOE 实战(投资 3000 万、周期 24 个月)和 某政务云 Oracle 整合实践两个真实案例,展示千万级项目的实战经验。包含 迁移检查清单、工具配置模板、避坑指南。DBA 必备!

腾讯云创作之星、华为云云享专家,深耕电商全栈高并发系统实战,分享可商用商城项目源码。 385

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

达梦数据库-学习-34-DBLINK(Oracle到达梦,达梦到达梦)

本文详细介绍了DM数据库与Oracle数据库之间的DBLINK配置方法,包含环境准备、权限设置、环境变量配置等具体步骤。文章提供了两种典型场景的测试案例:Oracle到DM的OCI连接测试和DM到DM的DPI连接测试,并给出了详细的操作命令和验证方法。同时,还介绍了DBLINK相关视图的使用、参数配置说明以及常见错误(如库文件加载失败、连接丢失)的分析与解决方法。全文通过具体示例,系统地阐述了DM数据库中DBLINK的实现原理和应用场景,为数据库管理员提供了实用的技术参考。

qq_45111959的博客 1745

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java基础面试题总结《三》

SPI全称是(服务提供者接口)。它是一种基于接口的动态扩展机制。简单来说,就是 Java 定义了一套标准接口,但具体的实现交给第三方(开发者或厂商)去完成。系统运行时,会自动发现并加载这些实现类,而不需要硬编码在代码里。目的:确保逻辑相等的对象拥有相同的哈希码,从而能被正确地存入和取出哈希集合。原则只要参与了哈希运算(作为 Key 或集合元素),就必须同时重写这两个方法。策略模式和观察者模式都属于行为型设计模式。

qq_55862497的博客 259
上一篇: MySQL:我的从库竟是我自己!?
下一篇: 又是一条慢 SQL 改写,拿捏!
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值