三大兼容 | 人大金仓兼容+优化MySQL用户变量特性
目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使数据库的易用性得到了极大优化,下面来一探究竟吧!
什么是用户变量?
用户变量是用户自定义的保存单个特定类型数据值的临时对象,是为了适应在数据库使用时需要临时暂存值的场景而设计的,目的是提高数据库系统的易用性。
用户变量的应用场景十分广泛,以下是两个典型的使用场景:
(1) 用于暂存值,当某个数值需要出现在不同的查询中,或者是同一个查询内的不同位置时,可以先将该数值赋给用户变量,在查询中使用该数值的位置用用户变量替代。例如:
(2) 用于表达式递归计算,递归计算中需要用到变量的值,同时要将计算结果重新赋给变量,循环往复。比如投影列中需要标记结果集的行号时,可以写成如下语句:
KingbaseES的GUC参数和局部变量的区别
”
KingbaseES的GUC参数是控制数据库系统运行时状态所必须的,因此它的数量,名字都是固定的,不允许用户自行添加和删除。部分GUC参数的值可以修改,通过SET语法设置,通过RESET或DISCARD语法重置。
在KingbaseES的PLSQL语言中允许使用局部变量,局部变量仅在PLSQL程序块内使用,可以随意命名、赋值。脱离了程序块以后,局部变量将变得不可见。程序块嵌套时,内层的局部变量将覆盖外层同名的局部变量。KingbaseES中,GUC参数、用户变量和局部变量的实现是互相分离的,因此其命名也没有冲突。
KingbaseES
用户变量特性
1
命名规则
用户变量命名以@为前缀,变量名包含字母(大小写不敏感),数字,中文字符以及“.”“_”,和“$”符号。如果用单引号引上,变量名可以是任意字符串,比如@’var-name’也是支持的。这点和MySQL一致。
2
存储类型
KingbaseES用户变量支持的存储类型有五种,分别为bool, int8(bigint), float8(double), numeric, char(string);默认的存储类型为char。其他类型的值存储为用户变量时会依据内部规则转换为以上五种类型。KingbaseES在存储类型上比MySQL多出一个bool类型。
3
使用方式
KingbaseES用户变量的使用比较灵活。在使用时不必事先声明,可以先赋值后引用,也可以直接引用。赋值时数据库会自动确定用户变量的存储类型,因此不必显式指定类型。KingbaseES允许对用户变量多次赋值,赋值时不限定类型(类型可变)。在未赋值条件下直接引用用户变量时,存储类型为char, 显示类型为text,值为null。这点和MySQL一致。
4
可见性
KingbaseES用户变量在连接内可见,连接外不可见,连接断开时用户变量自动释放。这点和MySQL一致。
5
用户变量的语法
KingbaseES完全兼容MySQL用户变量的SET赋值语法、SELECT INTO赋值语法、表达式赋值和取值语法。同时增加了KingbaseES特有的删除语法,用户可以通过“RESET @var_name;”删除单个用户变量,或者通过“DISCARD USER VARIABLES;”删除所有用户变量。
KingbaseES
兼容+优化MySQL用户变量特性
1
MySQL用户变量的使用问题
MySQL用户变量类型易变,单值存储,赋值和取值是表达式的一部分,可以出现在查询中的大多数地方,这样的特性或特性组合造成了MySQL用户变量的使用问题。第一类问题是由于类型的易变性引起的。第二个问题是MySQL手册中明确说明用户变量的计算顺序是不确定的。第三个问题是由于单值存储导致的。
因此,MySQL手册中也明确表示在使用过程中用户需自行保证带有用户变量查询的结果集的正确性。虽然用户变量的表达式赋值会带来许多的问题,但是由于表达式赋值在实际使用中非常普遍,我们实现了表达式赋值。
2
KingbaseES在表达式上对MySQL的改进
在KingbaseES中,对投影列中用户变量取值时类型的根据KingbaseES的语义解析顺序,离该取值最近的赋值类型确定为用户变量的数据类型。如果用户变量没有赋值,使用已存在用户变量类型;如果用户变量不存在,则取默认类型(字符串)。举例如下:
在查询执行时,KingbaseES中用户变量的计算顺序也是确定的,即依据KingbaseES的语义解析顺序处理。
除此之外,KingbaseES对用户变量的优化和并行,并发进行了限制。
由于用户变量是单值存储,类型可变的,如果遇上并发,并行与用户变量赋值混合的情况,用户变量的值将变得不可预测。因此,在使用用户变量时,禁止查询并发,并行。KingbaseES在数据库内部对这两个特性进行了禁止,使用者无需做任何操作。
在执行包含用户变量的语句时,执行性能相比无用户变量的语句会有下降,这是正常的。为了保证结果集的正确性,包含用户变量的语句需要尽可能按输入语法的顺序执行。因此不能使用优化器进行优化,也不能并行执行其中的某些步骤。
3
KingbaseES用户变量表达式的使用注意事项
用户变量的类型是可变的,但是在SELECT查询中,需要确保列类型前后保持一致。如果在计算过程中用户变量类型发生了变化,结果集将会变得不可预期。因此,在使用用户变量时,用户需要自行保证结果集的正确性。比如,确保用户变量类型在计算过程中不发生变化,如果发生了变化,可以通过隐式转换转为预期类型等。
如果在单个 SELECT 语句中有多个用户变量赋值子句,KingbaseES会依据内部的解析顺序执行,不能完全保证表达式求值的顺序符合用户期望。KingbaseES尽可能使表达式按照KingbaseES语义顺序求值,但是由于优化器的影响,求值顺序可能无法完全保证。
为了保证用户变量类型在计算过程中保持不变,给用户变量赋值尽可能使用SET语法和SELECT INTO语法,避免使用表达式赋值语法(该语法主要为兼容MySQL历史用例而设计)。必须要使用表达式赋值时,尽可能将赋值用在投影列最外层,尽量少用在其他的位置,比如JOIN ON,HAVING, GROUP BY,ORDER BY子句中,在这些子句中使用表达式赋值语法可能会造成无法预期的结果集。
一个常见的用法是在投影列中使用@var_name := @var_name +1的方式来标记结果集的行号,KingbaseES提供的row_number函数能够替代上述使用方式。
如果事务执行时语句中包含用户变量赋值,事务回滚时用户变量不会被回滚。
在KingbaseES的操作符中有许多包含@字符的操作符,用户变量在和操作符混用时,为了避免产生语法错误,需要将用户变量和操作符用空格隔开。例如@var_name:=@var_name+1虽然可以执行,但还是建议写成@var_name := @var_name + 1的形式。因为我们无法避免用户将:=@定义为操作符。
字符“@”在KingbaseES中也可作为操作符,为了兼容原生KingbaseES,@var_name中的var_name将解析成用户变量,这里“@”为用户变量引导符。而@ var_name中的var_name将解析成标识符,“@”为操作符。
END
用户变量的设计是KingbaseES为数据库用户提供易用性方面的一次探索。用户可以利用用户变量暂存中间值,该中间值既可以在同一连接内跨语句使用,也可以在同一条语句的不同运算中使用。和局部变量相比,用户变量突破了块的作用域限制,使用范围更大。此外,由于用户变量自身的特点(单值存储,类型可变),造成了用户变量使用受到了限制。在未来,KingbaseES会继续秉承以客户为中心的理念,为数据库使用者提供更加易用的功能。
推荐阅读 (点击下图了解更多↓↓↓↓)
供稿:产品研发中心
编辑:王堇
审核:日尧
相关文章:

三大兼容 | 人大金仓兼容+优化MySQL用户变量特性
目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使…...

Git介绍与安装使用
目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…...
理解DuLinkList L中的“”引用符号
在C中,DuLinkList &L 这种形式的参数表示 L 是一个 DuLinkList 类型的引用。这里的 & 符号表示引用。 引用是C的一个特性,它提供了一种方式来访问已存在的变量的别名。当你对引用进行操作时,实际上是在操作它所引用的变量。如果你在…...
前端并发多个请求并失败重发
const MAX_RETRIES 3;// 模拟请求 function makeRequest(url) {return new Promise((resolve, reject) > {setTimeout(() > {Math.random() < 0.75 ? resolve(${url} 成功) : reject(${url} 失败); // 随机决定请求是否成功}, Math.random() * 2000); // 随机延时执…...

【Qt开发流程】之对象模型2:属性系统
描述 Qt提供了一个复杂的属性系统,类似于一些编译器供应商提供的属性系统。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译器特性,如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…...
PHP之curl详细讲解
cURL(全称为Client for URLs)是一个功能强大的开源库,用于在多种协议上进行数据传输、发送HTTP请求和获取响应。它支持多种协议,包括HTTP、HTTPS、FTP、SMTP等,并且能够与各种服务器进行通信。 cURL库可以通过命令行工…...

R语言30分钟上手
文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…...

上下拉电阻会增强驱动能力吗?
最近看到一个关于上下拉电阻的问题,发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下,大家一致认为不存在上下拉电阻增强驱动能力这回事,因为除了OC输出这类特殊结构外,上下拉电阻就是负载,只会减…...

题目:小明的彩灯(蓝桥OJ 1276)
题目描述: 解题思路: 一段连续区间加减,采用差分。最终每个元素结果与0比较大小,比0小即负数输出0。 题解: #include<bits/stdc.h> using namespace std;using ll long long; const int N 1e5 10; ll a[N],…...

换元法求不定积分
1.一般步骤:选取换元对象(不一定是式子中的值,也可以是式子中的最小公倍数或者最大公因数),然后将dx换为dt*t的导数,再用t将原式表示,化简计算即可 2. 3. 4. 5. 6....
在Docker容器中启用SSH服务,实现外部访问的详细教程
目录 步骤 1: 安装 SSH 服务器 步骤 2: 配置 SSH 服务器 步骤 3: 设置 SSH 用户 步骤 4: 重启 SSH 服务器 步骤 5: 映射容器端口 步骤 6: 使用 SSH 连接到容器 要在Docker容器中启用SSH服务,以便从外部访问,您需要执行以下步骤: 步骤 …...
Go 模块系统最小版本选择法 MVS 详解
目录 Golang 模块系统简介 包版本管理 最小版本选择(MVS)原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性,主要目的是解决 Go 项目中的依赖管理问题。在模…...
ifstream读取txt中的中文数据转成QString出现乱码
使用ifstream从txt文本中读取中文数据到string,再将string转成QString输出时出现了乱码。 分析:如果ifstream能成功从txt文本中读出中文数据,那大概率txt用的编码是ANSI编码(GBK就是ANSI的一种),那么在转成…...

UE4 双屏分辨率设置
背景: 做了一个UI 应用,需要在双屏上进行显示。 分辨率如下:3840*1080; 各种折腾,其实很简单: 主要是在全屏模式的时候 一开始没有选对,双屏总是不稳定。 全屏模式改成:Windows 之…...

$sformat在仿真中打印文本名的使用
在仿真中,定义队列,使用任务进行函数传递,并传递文件名,传递队列,进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串,在仿真的时候进行文件…...
【Rust】结构体与枚举
文章目录 结构体struct基础用法使用字段初始化简写语法使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体方法语法关联函数多个 impl 块 枚举枚举值Option 结构体struct 基础用法 一个存储用户账号信息的结构体: struct User {active: bo…...
CentOS7 防火墙常用命令
以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令: 检查防火墙状态: sudo firewall-cmd --state 启动防火墙: sudo systemctl start firewalld 停止防火墙: sudo systemctl stop firewalld 重启防火墙&…...

【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目
什么是UL9540测试,UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室(Underwriters Laboratories)发布的标准,名称为"UL 9540: Energy Storage Systems and Equipment",翻译为中文为"能量存储…...

springcloud整合Oauth2自定义登录/登出接口
我使用的是password模式,并配置了token模式 一、登录 (这里我使用的示例是用户名密码认证方式) 1. Oath2提供默认登录授权接口 org.springframework.security.oauth2.provider.endpoint.postAccess; Tokenpublic ResponseEntity<OAuth2AccessToken> pos…...
Oracle常见内置程序包的使用Package
Oracle常见内置程序包的使用 点击此处可跳转至:Oracle的程序包(Package),对包的基础进行学习常见内置程序包的使用Package1、DBMS_OUTPUT包2、DBMS_XMLQUERY包3、DBMS_RANDOM包4、UTL_FILE包5、DBMS_JOB包6、DBMS_LOB包7、DBMS_SQL包8、DBMS_LOCK包9、DB…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...