MySQL项目迁移华为GaussDB PG模式指南

文章目录

  • 0. 前言
  • 1. 数据库模式选择(B/PG)
  • 2.驱动选择
    • 2.1. 使用postgresql驱动
    • 2.1. 使用opengaussjdbc驱动
  • 3. 其他考虑因素
  • 4. PG模式
    • 4.1 MySQL和OpenGauss不兼容的语法处理建议
    • 4.2 语法差异
  • 6. 高斯数据库 PG模式JDBC 使用示例验证
  • 6. 参考资料

本章节主要介绍MySQL项目迁移华为GaussDB PG模式指南
在这里插入图片描述

0. 前言

本文是关于如何将MySQL项目迁移到华为GaussDB PG模式的详细教程。

背景:在当今的国际形势严峻,很多卡脖子的技术搞得我们国内奋发图强,以华为为代表的国产数据库。在很多国企的系统中已经开始迁移。国产数据库的重要性不言而喻。

本文整理总计了一下从MySQL迁移到华为的GaussDB PG模式。这两种数据库在核心上有很大的不同,因此这个迁移过程可能会遇到一些困难。本文将详细介绍如何进行这种迁移,包括数据迁移,表结构迁移,以及索引、触发器、存储过程和函数的迁移等步骤。无论你是数据库管理员,还是只是想要了解这个过程的人,都可以从本文中获得有用的信息。

1. 数据库模式选择(B/PG)

GaussDB 是华为提供的一种数据库解决方案,它支持多种存储引擎和数据库模式。在 GaussDB 中,B 和 PG 分别是两种不同的数据库模式。

  • B 模式:这通常是基于 GaussDB 自己的原生存储引擎。这种模式可能提供更多的高级特性和优化,特别是针对大规模、高并发的环境。

  • PG 模式:这是基于 PostgreSQL 的模式。如果你的应用或系统已经在使用 PostgreSQL,或者你需要一个与 PostgreSQL 兼容的解决方案,那么这可能是更好的选择。

2.驱动选择

2.1. 使用postgresql驱动

如果使用PG模式,在3.x版本可以直接使用pgSQL的驱动我们项目亲测

org.postgresql postgresql 42.3.1

在代码中创建连接之前任意位置隐含装载:Class.forName(“org.postgresql.Driver”);
在JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest
这些文件都是不同版本的OpenGauss JDBC驱动,用于Java应用程序连接到OpenGauss数据库。

2.1. 使用opengaussjdbc驱动

当使用opengaussjdbc.jar时,上面的Driver类名相应修改为“com.huawei.opengauss.jdbc.Driver”。

文件名称说明文件大小最后修改时间
gsjdbc200.jar针对某些版本的Java(如Java 2.0)的OpenGauss JDBC驱动909 kB2023/3/27 00:43:23
gsjdbc4.jar针对Java 4或更高版本的OpenGauss JDBC驱动896 kB2023/3/27 00:43:23
opengaussjdbc.jar通用的OpenGauss JDBC驱动909 kB2023/3/27 00:43:23

3. 其他考虑因素

  1. 兼容性如果你需要与 PostgreSQL 兼容,那么 PG 模式可能是更好的选择。

  2. 性能需求对于特定的高性能或大规模需求,B 模式可能提供更多的优化选项。

  3. 特性需求某些高级功能可能只在特定的模式下可用。

  4. 团队经验如果你的团队有更多的 PostgreSQL 经验,那么 PG 模式可能更适合;反之亦然。

  5. 迁移和集成考虑到数据迁移和系统集成的复杂性和成本,选择一个与现有系统更兼容的模式。

  6. 成本不同的模式可能有不同的成本结构,包括授权费用和运维成本。

项目迁移数据库类型可是一个大工程,在迁移之初一定要做好充分的调研。建议在确定模式之前,进行性能和兼容性测试,以确保你的选择能满足业务和技术需求。
在 GaussDB 的 PG 模式下,虽然它已经做出了很大的努力来实现对 PostgreSQL 的兼容,但仍然可能存在一些与 MySQL 不兼容的情况。如果你在迁移过程中遇到了这样的问题,以下是一些处理建议:

  1. 了解两种数据库的差异:首先,你需要理解 MySQL 和 OpenGauss(GaussDB 的 PG 模式)在 SQL 语法、数据类型、函数、存储过程等方面的差异。这将帮助你更好地理解迁移过程中可能出现的问题。

  2. 使用数据库迁移工具:对于大规模的数据库迁移,手动修改 SQL 语句可能并不现实。你可以考虑使用数据库迁移工具,如 AWS DMS(Database Migration Service)或 Azure Database Migration Service,这些工具可以自动处理一些常见的不兼容问题。

  3. 手动修改 SQL 语句:对于一些特定的不兼容问题,你可能需要手动修改你的 SQL 语句。例如,MySQL 使用 AUTO_INCREMENT 在表定义中创建自增字段,而 OpenGauss 使用 SERIAL 数据类型。对于这样的差异,你需要手动修改你的表定义。

  4. 修改应用代码:在某些情况下,你可能需要修改你的应用代码来适应新的数据库。例如,如果你的应用依赖于 MySQL 的特定功能(如全文搜索或地理空间查询),你可能需要重新实现这些功能以使用 OpenGauss 的等价功能。

4. PG模式

4.1 MySQL和OpenGauss不兼容的语法处理建议

以下是在GaussDB PG(OpenGauss)和MySQL之间的一些主要的SQL语法不兼容性。这个列表包含了一些主要的不同之处,但并不是全部的不兼容性。在进行迁移之前,建议深入对比和测试以确保兼容性。

MySQLOpenGauss备注
AUTO_INCREMENTSERIAL序列生成器
SHOW TABLES\dt查看所有表
SHOW DATABASES\l查看所有数据库
LIMIT n OFFSET mLIMIT n OFFSET mFETCH FIRST n ROWS ONLY OFFSET m分页查询
DESCRIBE table or DESC table\d table描述表结构
CONCAT(str1, str2, ...)`str1
SUBSTRING(str, pos, len)SUBSTRING(str FROM pos FOR len)子字符串
LENGTH(str)LENGTH(str)CHAR_LENGTH(str)字符串长度
CURDATE()CURRENT_DATE当前日期
NOW()CURRENT_TIMESTAMP当前时间
RAND()RANDOM()生成随机数
IFNULL(exp, replace_exp)COALESCE(exp, replace_exp)判断表达式是否为空
ISNULL(exp)exp IS NULL判断表达式是否为空
` 作为标识符引用符" 作为标识符引用符标识符引用符
存储过程使用 BEGINEND存储过程使用 $$存储过程定义
TRUNCATE TABLE 不可在事务中TRUNCATE TABLE 可在事务中清空表数据
REPLACE INTOINSERT ... ON CONFLICT DO UPDATE插入冲突更新
REGEXP~正则表达式搜索
CREATE DATABASE 不支持所有者CREATE DATABASE 支持所有者创建数据库
ENUM 类型无对应,可用 CHECK 约束代替类型不一致
SET 类型无对应,可用 ARRAY 类型代替类型不一致
YEAR 类型无对应,可用 INTERVAL YEARDATE 类型代替类型不一致
UNSIGNED 类型无对应,需注意数值范围类型不一致
ZEROFILL 类型无对应,需在应用层处理类型不一致
SHOW CREATE TABLEpg_dump -t table -s查看表创建语句
ENGINE = InnoDB无对应存储引擎
CHARSET = utf8mb4ENCODING = UTF8字符集
COLLATE = utf8mb4_binCOLLATE "C"排序规则
分区表分区表分区定义语法不同
CREATE USERCREATE ROLE创建用户
REVOKE ALL PRIVILEGESREVOKE ALL撤销权限
GRANT SELECT ON *.*GRANT SELECT ON ALL TABLES IN SCHEMA授予权限
/*!50003 CREATE*/CREATE OR REPLACE创建或替换
LOCK TABLESLOCK TABLE锁表
UNLOCK TABLESCOMMIT解锁
KILL QUERYCANCEL取消查询
SHOW PROCESSLISTSELECT * FROM pg_stat_activity查看进程列表
LOAD DATA INFILECOPY数据导入
SELECT INTO OUTFILECOPY TO数据导出
RENAME COLUMNALTER COLUMN RENAME重命名列
RENAME INDEXALTER INDEX RENAME重命名索引
RENAME DATABASE无对应重命名数据库
ALTER DATABASE 不支持修改所有者ALTER DATABASE 支持修改所有者修改数据库所有者
ALTER DATABASE 支持修改字符集和排序规则ALTER DATABASE 不支持修改字符集和排序规则修改数据库字符集和排序规则
ALTER TABLE 支持一次修改多个列ALTER TABLE 一次只能修改一个列修改表列
ALTER TABLE 支持一次添加多个索引ALTER TABLE 一次只能添加一个索引添加表索引
ALTER TABLE 支持一次删除多个索引ALTER TABLE 一次只能删除一个索引删除表索引
ALTER TABLE 支持修改存储引擎ALTER TABLE 不支持修改存储引擎修改表存储引擎
ALTER TABLE 支持修改字符集和排序规则ALTER TABLE 不支持修改字符集和排序规则修改表字符集和排序规则
ALTER TABLE 支持修改自增值ALTER TABLE 不支持修改自增值修改表自增值

4.2 语法差异

序号描述MySQLGaussDB PG
1插入并在存在时更新REPLACE INTO 或 INSERT … ON DUPLICATE KEY UPDATE …INSERT … ON CONFLICT DO UPDATE …
2使用 LIMIT 进行分页查询SELECT … LIMIT offset, countSELECT … LIMIT count OFFSET offset
3单行插入返回插入的 IDINSERT INTO …; SELECT LAST_INSERT_ID();INSERT INTO … RETURNING id;
4单行更新返回更新的行UPDATE …; SELECT …;UPDATE … RETURNING *;
5单行删除返回删除的行DELETE …; SELECT …;DELETE … RETURNING *;
6随机获取一行记录SELECT … ORDER BY RAND() LIMIT 1SELECT … ORDER BY RANDOM() LIMIT 1
7索引字段查询优化SELECT * FROM table USE INDEX(index) WHERE column = valueSET enable_seqscan TO OFF; SELECT * FROM table WHERE column = value; SET enable_seqscan TO ON;
8使用全文索引搜索MATCH(column) AGAINST(‘text’)to_tsvector(column) @@ to_tsquery(‘text’)
9查询特定范围的行SELECT * FROM table LIMIT x, ySELECT * FROM table LIMIT y OFFSET x
10使用存储过程CALL procedure_name()SELECT * FROM procedure_name()
11事务处理START TRANSACTION; COMMIT; ROLLBACK;BEGIN; COMMIT; ROLLBACK;
12创建临时表CREATE TEMPORARY TABLE table_nameCREATE TEMP TABLE table_name
13MySQL使用反引号(``)引用表名和列名SELECT column FROM tableSELECT “column” FROM “table”
14时间和日期函数DATE(), NOW(), YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()CURRENT_DATE, CURRENT_TIME, DATE_PART(‘year’, column), DATE_PART(‘month’, column), DATE_PART(‘day’, column), DATE_PART(‘hour’, column), DATE_PART(‘minute’, column), DATE_PART(‘second’, column)
15字符串连接函数CONCAT(column1, column2)column1
16对分组的限制SELECT … FROM … GROUP BY … WITH ROLLUPSELECT … FROM … GROUP BY … ROLLUP(…)
17对NULL的处理SELECT IFNULL(column, 0) FROM tableSELECT COALESCE(column, 0) FROM table
18判断是否为空SELECT column IS NULL FROM tableSELECT column IS NULL FROM table
19日期加减操作SELECT DATE_ADD(date, INTERVAL 1 DAY) FROM tableSELECT date + INTERVAL ‘1 day’ FROM table
20创建自增主键CREATE TABLE table (id INT AUTO_INCREMENT, PRIMARY KEY (id))CREATE TABLE table (id SERIAL PRIMARY KEY)
21使用正则表达式匹配数据SELECT column REGEXP ‘pattern’ FROM tableSELECT column ~ ‘pattern’ FROM table
22计算平均值SELECT AVG(column) FROM tableSELECT AVG(column) FROM table
23计算最大值SELECT MAX(column) FROM tableSELECT MAX(column) FROM table
24计算最小值SELECT MIN(column) FROM tableSELECT MIN(column) FROM table
25计算总和SELECT SUM(column) FROM tableSELECT SUM(column) FROM table
26计算记录数SELECT COUNT(column) FROM tableSELECT COUNT(column) FROM table
27使用内置数学函数SELECT ABS(column), CEIL(column), FLOOR(column), ROUND(column) FROM tableSELECT ABS(column), CEILING(column), FLOOR(column), ROUND(column) FROM table
28使用内置字符串函数SELECT CHAR_LENGTH(column), LOWER(column), UPPER(column), REVERSE(column) FROM tableSELECT LENGTH(column), LOWER(column), UPPER(column), REVERSE(column) FROM table
29使用内置日期函数SELECT CURRENT_DATE(), CURRENT_TIME(), DATE_FORMAT(date, ‘format’) FROM tableSELECT CURRENT_DATE, CURRENT_TIME, TO_CHAR(date, ‘format’) FROM table
30使用内置转换函数SELECT CAST(column AS type) FROM tableSELECT CAST(column AS type) FROM table

在华为GaussDB PG模式迁移MySQL项目中,这个过程可能会涉及到数据、表结构、索引、触发器、存储过程和函数的迁移。以下是一些具体步骤:

准备工作:

  1. 确保MySQL和GaussDB PG版本所支持的功能是兼容的。
  2. 在GaussDB PG创建一个新的数据库来保存迁移过来的数据。
  3. 确保你的MySQL数据已经被备份。

步骤1: 数据迁移

  1. 使用mysqldump工具导出MySQL数据库的数据。例如:mysqldump -u [username] -p [password] [database_name] > [dump_file.sql]
  2. 使用pgloader工具将MySQL数据导入到GaussDB PG中。例如:pgloader mysql://[username]:[password]@localhost/[database_name] postgresql:///new_database

步骤2: 表结构迁移

  1. 使用MySQL 客户端等工具查看MySQL的表结构。
  2. 根据MySQL的表结构,在GaussDB PG中创建相应的表结构,也可以在找找其他工具是否可以批量同步生成。
  3. 请注意,MySQL和GaussDB PG中的数据类型可能是不一样的,所以在创建表结构时,需要做相应的类型转换。

步骤3: 索引、触发器、存储过程和函数的迁移

  1. 通过SHOW INDEX FROM [table_name]在MySQL中查看索引。
  2. 在GaussDB PG中创建相应的索引。
  3. 通过SHOW TRIGGERS在MySQL中查看触发器。
  4. 在GaussDB PG中创建相应的触发器。
  5. 使用SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS在MySQL中查看存储过程和函数。
  6. 在GaussDB PG中创建相应的存储过程和函数。

注意:这些步骤可能需要一些SQL知识,并且在迁移过程中可能会遇到一些问题,比如数据类型不匹配、编码问题等,需要根据实际情况进行调整。

6. 高斯数据库 PG模式JDBC 使用示例验证

高斯数据库(GaussDB)。对于PG模式,可以使用PostgreSQL JDBC驱动来连接。

添加PostgreSQL JDBC驱动的Maven依赖:

<dependencies><!-- PostgreSQL JDBC driver --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.3.1</version>  <!-- 这里的版本号根据实际情况更改 --></dependency>
</dependencies>

可以使用以下Java代码来连接到GaussDB并执行查询。如果是使用持久化框架,比如MyBatis 或者MP 或者JPA hbernate 等就不需要手动创建连接。只需要换一下配置中的jdbc连接串

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class Main {public static void main(String[] args) {try {// 加载驱动Class.forName("org.postgresql.Driver");// 连接数据库,注意URL的格式,包括服务器地址、端口、数据库名、SSL和其他参数String url = "jdbc:postgresql://your_server:your_port/your_database?ssl=true&"+ "sslfactory=org.postgresql.ssl.NonValidatingFactory";Connection conn = DriverManager.getConnection(url, "your_user", "your_password");// 创建一个Statement对象并执行SQL查询Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM your_table");// 处理查询结果while (rs.next()) {System.out.println(rs.getString("your_column"));}// 关闭连接rs.close();stmt.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}

6. 参考资料

  1. GaussDB官方文档:https://support.huaweicloud.com/intl/zh-cn/opengauss/index.html
  2. PostgreSQL JDBC驱动的官方文档:https://www.postgresql.org/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110055.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置uniapp调试环境

目录 uni-app介绍 uni-app开发工具HBuilderX 创建项目前提条件 uni-app项目结构 配置mumu模拟器 uni-app生命周期 1.应用生命周期 小程序规范 2.页面生命周期-小程序规范 3.组件生命周期 vue规范 uni-app登录按钮方法 uni-app发布安卓app uni-app介绍 uni-app 是一个…

JavaScript设计模式(二)——简单工厂模式、抽象工厂模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

ASUS华硕天选4笔记本电脑FA507XV原厂Windows11系统22H2

天选四FA507X原装系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件 华硕电脑管家、奥创控制中心等预装程序&#xff0c;恢复出厂状态W11 链接&#xff1a;https://pan.baidu.com/s/1SPoFW7wR5KawGu-yMckNzg?pwdayxd 提取码&#xff1a;ayxd

开源与可持续发展:环境友好的技术选择

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【数据结构大全】你想要的都有,数组、链表、堆栈、二叉树、红黑树、B树、图......

目录 1.概述 2.线性结构 3.时间复杂度 4.查找算法 5.树 6.图 1.概述 博主之前写过一个完整的关于数据结构的系列文章&#xff0c;一共十三篇&#xff0c;内容包含&#xff0c;数组、链表、堆栈、队列、时间复杂度、顺序查找、二分查找、二叉树、二叉搜索树、平衡二叉树、…

电脑不安装软件,怎么将手机文件传输到电脑?

很多人都知道&#xff0c;AirDroid有网页版&#xff08;web.airdroid.com&#xff09;。 想要文件传输&#xff0c;却不想在电脑安装软件时&#xff0c;AirDroid的网页版其实也可以传输文件。 然而&#xff0c;要将文件从手机传输文件到网页端所在的电脑时&#xff0c;如果按…

JavaIO流

JavaIO流 一、概念二、File类三、File类的使用1、File文件/文件夹类的创建2、File类的获取操作3、File类判断操作 - boolean4、File类对文件/文件夹的增删改5、File类的获取子文件夹以及子文件的方法 四、Java中IO流多种维度的维度1、按照流向 - Java程序2、按照流的大小分类3、…

LInux之chrony服务器

目录 场景 重要性 LInux的两个时钟 硬件时钟 系统时钟 NTP协议 Chrony介绍 定义 组成 --- chronyd和chronyc 安装与配置 安装 Chrony配置文件分析 同步时间服务器 chronyc命令 chronyc sources输出分析 其它命令 查看时间服务器的状态 查看时间服务器是否在线 …

18-使用钩子函数判断用户登录权限-登录前缀

钩子函数的两种应用: (1). 应用在app上 before_first_request before_request after_request teardown_request (2). 应用在蓝图上 before_app_first_request #只会在第一次请求执行,往后就不执行, (待定,此属性没调试通过) before_app_request # 每次请求都会执行一次(重点…

服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践

作者&#xff1a;王夕宁、 刘强、 华相 公司介绍 丽迅物流是百丽旗下专注于时尚产业、为企业提供专业物流及供应链解决方案的服务商。其产品服务主要包括城市落地配、仓配一体、干线运输及定制化解决方案。通过自研智能化物流管理平台&#xff0c;全面助力企业合作集约化发展…

玩转软件|钉钉个人版内测启动:AI探索未来的工作方式

目录 前言 正文 AI为核心&#xff0c;个人效率为王&#xff01; 指令中心&#xff0c;解锁AI技巧&#xff01; 灵感Store&#xff0c;探索更多可能&#xff01; 未来的AI&#xff0c;即将问世&#xff01; 个人内测体验 前言 重磅消息&#xff1a;钉钉个人版在8月16日正…

Android实现监听APP启动、前台和后台

Android 实时监听APP进入前台或后台 前言 在我们开发的过程中&#xff0c;经常会遇到需要我们判断app进入后台&#xff0c;或者切换到前台的情况。比如我们想判断app切换到前台时&#xff0c;显示一个解锁界面&#xff0c;要求用户输入解锁密码才能继续进行操作&#xff1b;我…

不同子网络中的通信过程

从输入www.baidu.com经历了什么 一、DNS&#xff08;网址->IP&#xff09; 二、ARP&#xff08;IP->MAC&#xff09; A->B&#xff1a;有数据发送&#xff0c;数据封装ip之后发现没有主机B的mac地址。然后ARP在本网段广播&#xff1a;检查目标地址和源地址是否在同一…

抖音矩阵,矩阵账号开发,抖音矩阵源码搭建

抖音矩阵&#xff0c;矩阵账号开发&#xff0c;抖音矩阵源码搭建&#xff1a; 1、账号矩阵系统搭建首先需要注意的是支持多平台&#xff0c;多账号&#xff0c;可以实现流量互通&#xff0c;账号矩阵多个账号联动形成账号矩阵形式分发开发。 2、账号矩阵系统需要可以查看分发…

Node与Express后端架构:高性能的Web应用服务

在现代Web应用开发中&#xff0c;后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台&#xff0c;以及Express作为一个流行的Node.js框架&#xff0c;共同构建了高性能的Web应用服务。 在本文中&#xff0c;我们将深入探讨Node与Express后端架构…

基于梯度算法优化的BP神经网络(预测应用) - 附代码

基于梯度算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于梯度算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.梯度优化BP神经网络2.1 BP神经网络参数设置2.2 梯度算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Bootstrap 源代码目录结构一览

目录 前言 Bootstrap 目录结构 Bootstrap 内容简介 Bootstrap 编译文件 CSS文件 | CSS 文件功能对比与清单 JS文件 | JS 文件功能对比与清单 Bootstrap 源码码目录 | 资源清单 前言 Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Ot…

Visual Studio编译出来的程序无法在其它电脑上运行

在其它电脑&#xff08;比如Windows Server 2012&#xff09;上运行Visual Studio编译出来的应用程序&#xff0c;结果报错&#xff1a;“无法启动此程序&#xff0c;因为计算机中丢失VCRUNTIME140.dll。尝试重新安装该程序以解决此问题。” 解决方法&#xff1a; 属性 -> …

ConsoleApplication815项目(直接加载+VEH Hook Load)

上线图 ConsoleApplication815.cpp #include <iostream> #include<Windows.h> #include "detours.h" #include "detver.h" #pragma comment(lib,"detours.lib")#pragma warning(disable:4996)LPVOID Beacon_address; SIZE_T Beacon…

机器视觉工程师永不为奴,他们是肯干肯出差肯加班肯拼命肯被使唤肯被叼

​ 永不为奴&#xff0c;为什么这样呐喊&#xff0c;真的很难做到。我们职业机器视觉工程师&#xff0c;本身职业具有一大特点就是专业性。 但是我们机器视觉工程师是专业技术绝不苟同于不是技术人员言语&#xff0c;我们很专业。 肯出差&#xff1a; 设备去那里&#xff0c;…