百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

针对MySQL特有函数的梧桐替代解决方法

wptr33 2025-04-07 20:06 4 浏览

MySQL 8.0 特有函数清单包含了一些重要的JSON函数、正则表达式函数和地理空间函数,我们针对这些内容,梳理了基于梧桐6.0版本的替代解决方法。以方便用户在平时的国产化项目及其它工作中更加方便的对照及参考。

MySQL 8.0 特有函数清单(扩展)

JSON 函数:

  1. JSON_ARRAYAGG(): 将某列的值聚合成一个JSON数组
  2. JSON_OBJECTAGG(): 将键值对聚合成一个JSON对象
  3. JSON_PRETTY(): 格式化输出JSON字符串,使其更易读
  4. JSON_TABLE(): 将JSON数组转换为关系表
  5. JSON_MERGE_PATCH(): 将两个JSON对象合并,后者的键值覆盖前者的键值
  6. JSON_STORAGE_SIZE(): 计算JSON对象的存储大小
  7. JSON_KEYS(): 获取JSON对象中的所有键
  8. JSON_DEPTH(): 计算JSON对象的嵌套深度
  9. JSON_LENGTH(): 计算JSON对象的长度
  10. JSON_CONTAINS(): 检查一个JSON对象是否包含另一个JSON对象
  11. JSON_CONTAINS_PATH(): 检查JSON对象是否包含指定路径
  12. JSON_EXTRACT(): 从JSON对象中提取指定路径的值
  13. JSON_REMOVE(): 从JSON对象中删除指定路径的值
  14. JSON_INSERT(): 向JSON对象中插入值
  15. JSON_REPLACE(): 替换JSON对象中的指定路径的值
  16. JSON_SET(): 设置JSON对象中的指定路径的值
  17. JSON_UNQUOTE(): 去掉JSON字符串的引号
  18. JSON_VALID(): 检查字符串是否为有效的JSON

正则表达式函数:

  1. REGEXP_LIKE(): 检查字符串是否匹配正则表达式
  2. REGEXP_INSTR(): 返回正则表达式匹配的位置
  3. REGEXP_SUBSTR(): 返回匹配正则表达式的子字符串
  4. REGEXP_REPLACE(): 用正则表达式替换字符串中的匹配部分

地理空间函数:

  1. ST_DISTANCE_SPHERE(): 计算球面上两点之间的距离
  2. ST_MAKEENVELOPE(): 创建一个矩形包络
  3. ST_MAKEPOINT(): 创建一个点
  4. ST_TRANSFORM(): 变换几何对象的坐标系
  5. ST_GEOMFROMGEOJSON(): 从GeoJSON创建几何对象
  6. ST_ASGEOJSON(): 将几何对象转换为GeoJSON
  7. ST_ISVALID(): 检查几何对象是否有效
  8. ST_ASTEXT(): 将几何对象转换为文本
  9. ST_SRID(): 返回几何对象的空间参考系统标识符
  10. ST_SETSRID(): 设置几何对象的空间参考系统标识符
  11. ST_DISTANCE(): 计算两几何对象之间的距离
  12. ST_INTERSECTS(): 检查两几何对象是否相交

详细说明及替代方案

JSON 函数:

  1. JSON_ARRAYAGG(): 将某列的值聚合成一个JSON数组
  2. MySQL 8.0:
  3. -- 将某列的值聚合成一个JSON数组
    SELECT JSON_ARRAYAGG(column) AS json_array FROM table_name;
  4. 梧桐 6.0 替代方案:
  5. -- 将某列的值聚合成一个JSON数组
    SELECT json_agg(column) AS json_array FROM table_name;
  6. JSON_OBJECTAGG(): 将键值对聚合成一个JSON对象
  7. MySQL 8.0:
  8. -- 将键值对聚合成一个JSON对象
    SELECT JSON_OBJECTAGG(key, value) AS json_object FROM table_name;
  9. 梧桐 6.0 替代方案:
  10. -- 将键值对聚合成一个JSON对象
    SELECT jsonb_object_agg(key, value) AS json_object FROM table_name;
  11. JSON_PRETTY(): 格式化输出JSON字符串,使其更易读
  12. MySQL 8.0:
  13. -- 格式化输出JSON字符串
    SELECT JSON_PRETTY('{"key": "value"}');
  14. 梧桐 6.0 替代方案:
  15. -- 格式化输出JSON字符串
    SELECT jsonb_pretty('{"key": "value"}'::jsonb);
  16. JSON_TABLE(): 将JSON数组转换为关系表
  17. MySQL 8.0:
  18. -- 将JSON数组转换为关系表
    SELECT * FROM JSON_TABLE(
    '[{"id": 1, "name": "John"}, {"id": 2, "name": "Jane"}]',
    "$[*]" COLUMNS (
    id INT PATH
    "$.id",
    name VARCHAR
    (50) PATH "$.name"
    )
    ) AS jt;
  19. 梧桐 6.0 替代方案:
  20. -- 将JSON数组转换为关系表
    SELECT * FROM json_to_recordset(
    '[{"id": 1, "name": "John"}, {"id": 2, "name": "Jane"}]'
    ) AS jt(id INT, name VARCHAR);
  21. JSON_MERGE_PATCH(): 将两个JSON对象合并,后者的键值覆盖前者的键值
  22. MySQL 8.0:
  23. -- 将两个JSON对象合并,后者的键值覆盖前者的键值
    SELECT JSON_MERGE_PATCH('{"a": 1, "b": 2}', '{"b": 3, "c": 4}');
  24. 梧桐 6.0 替代方案:
  25. -- 将两个JSON对象合并,后者的键值覆盖前者的键值
    SELECT '{"a": 1, "b": 2}'::jsonb || '{"b": 3, "c": 4}'::jsonb;
  26. JSON_STORAGE_SIZE(): 计算JSON对象的存储大小
  27. MySQL 8.0:
  28. -- 计算JSON对象的存储大小
    SELECT JSON_STORAGE_SIZE('{"a": 1, "b": 2}');
  29. 梧桐 6.0 替代方案:
  30. -- 计算JSON对象的存储大小
    SELECT pg_column_size('{"a": 1, "b": 2}'::jsonb);
  31. JSON_KEYS(): 获取JSON对象中的所有键
  32. MySQL 8.0:
  33. -- 获取JSON对象中的所有键
    SELECT JSON_KEYS('{"a": 1, "b": 2}');
  34. 梧桐 6.0 替代方案:
  35. -- 获取JSON对象中的所有键
    SELECT jsonb_object_keys('{"a": 1, "b": 2}'::jsonb);
  36. JSON_DEPTH(): 计算JSON对象的嵌套深度
  37. MySQL 8.0:
  38. -- 计算JSON对象的嵌套深度
    SELECT JSON_DEPTH('{"a": {"b": {"c": 1}}}');
  39. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,需要通过递归查询实现。
  40. -- 计算JSON对象的嵌套深度
    WITH RECURSIVE json_tree AS (
    SELECT
    jsonb_typeof('{"a": {"b": {"c": 1}}}'::jsonb) AS type,
    1 AS depth,
    '{"a": {"b": {"c": 1}}}'::jsonb AS js
    UNION ALL
    SELECT
    jsonb_typeof(value) AS type,
    depth + 1 AS depth,
    value
    FROM json_tree, jsonb_each(js)
    WHERE jsonb_typeof(js) = 'object'
    )
    SELECT MAX(depth) FROM json_tree;
  41. JSON_LENGTH(): 计算JSON对象的长度
  42. MySQL 8.0:
  43. -- 计算JSON对象的长度
    SELECT JSON_LENGTH('{"a": 1, "b": 2}');
  44. 梧桐 6.0 替代方案:
  45. -- 计算JSON对象的长度
    SELECT jsonb_array_length('{"a": 1, "b": 2}'::jsonb);
  46. JSON_CONTAINS(): 检查一个JSON对象是否包含另一个JSON对象
  47. MySQL 8.0:
  48. -- 检查一个JSON对象是否包含另一个JSON对象
    SELECT JSON_CONTAINS('{"a": 1, "b": 2}', '{"a": 1}');
  49. 梧桐 6.0 替代方案:
  50. -- 检查一个JSON对象是否包含另一个JSON对象
    SELECT '{"a": 1, "b": 2}'::jsonb @> '{"a": 1}'::jsonb;
  51. JSON_CONTAINS_PATH(): 检查JSON对象是否包含指定路径
  52. MySQL 8.0:
  53. -- 检查JSON对象是否包含指定路径
    SELECT JSON_CONTAINS_PATH('{"a": 1, "b": 2}', 'one', '$.a');
  54. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以通过 jsonb_path_exists 实现类似功能。
  55. -- 检查JSON对象是否包含指定路径
    SELECT jsonb_path_exists('{"a": 1, "b": 2}'::jsonb, '$.a');
  56. JSON_EXTRACT(): 从JSON对象中提取指定路径的值
  57. MySQL 8.0:
  58. -- 从JSON对象中提取指定路径的值
    SELECT JSON_EXTRACT('{"a": 1, "b": 2}', '$.a');
  59. 梧桐 6.0 替代方案:
  60. -- 从JSON对象中提取指定路径的值
    SELECT '{"a": 1, "b": 2}'::jsonb -> 'a';
  61. JSON_REMOVE(): 从JSON对象中删除指定路径的值
  62. MySQL 8.0:
  63. -- 从JSON对象中删除指定路径的值
    SELECT JSON_REMOVE('{"a": 1, "b": 2}', '$.a');
  64. 梧桐 6.0 替代方案:
  65. -- 从JSON对象中删除指定路径的值
    SELECT '{"a": 1, "b": 2}'::jsonb - 'a';
  66. JSON_INSERT(): 向JSON对象中插入值
  67. MySQL 8.0:
  68. -- 向JSON对象中插入值
    SELECT JSON_INSERT('{"a": 1}', '$.b', 2);
  69. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以通过 jsonb_set 实现类似功能。
  70. -- 向JSON对象中插入值
    SELECT jsonb_set('{"a": 1}'::jsonb, '{b}', '2'::jsonb);
  71. JSON_REPLACE(): 替换JSON对象中的指定路径的值
  72. MySQL 8.0:
  73. -- 替换JSON对象中的指定路径的值
    SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.a', 3);
  74. 梧桐 6.0 替代方案:
  75. -- 替换JSON对象中的指定路径的值
    SELECT jsonb_set('{"a": 1, "b": 2}'::jsonb, '{a}', '3'::jsonb);
  76. JSON_SET(): 设置JSON对象中的指定路径的值
  77. MySQL 8.0:
  78. -- 设置JSON对象中的指定路径的值
    SELECT JSON_SET('{"a": 1, "b": 2}', '$.a', 3);
  79. 梧桐 6.0 替代方案:
  80. -- 设置JSON对象中的指定路径的值
    SELECT jsonb_set('{"a": 1, "b": 2}'::jsonb, '{a}', '3'::jsonb);
  81. JSON_UNQUOTE(): 去掉JSON字符串的引号
  82. MySQL 8.0:
  83. -- 去掉JSON字符串的引号
    SELECT JSON_UNQUOTE('"hello"');
  84. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以使用 text 类型的转换来实现类似功能。
  85. -- 去掉JSON字符串的引号
    SELECT 'hello'::text;
  86. JSON_VALID(): 检查字符串是否为有效的JSON
  87. MySQL 8.0:
  88. -- 检查字符串是否为有效的JSON
    SELECT JSON_VALID('{"a": 1}');
  89. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以通过 TRY_CAST 进行 JSONB 类型转换判断。
  90. -- 检查字符串是否为有效的JSON
    SELECT CASE WHEN TRY_CAST('{"a": 1}' AS JSONB) IS NOT NULL THEN TRUE ELSE FALSE END;

正则表达式函数:

  1. REGEXP_LIKE(): 检查字符串是否匹配正则表达式
  2. MySQL 8.0:
  3. -- 检查字符串是否匹配正则表达式
    SELECT column FROM table_name WHERE REGEXP_LIKE(column, 'pattern');
  4. 梧桐 6.0 替代方案:
  5. -- 检查字符串是否匹配正则表达式
    SELECT column FROM table_name WHERE column ~ 'pattern';
  6. REGEXP_INSTR(): 返回正则表达式匹配的位置
  7. MySQL 8.0:
  8. -- 返回正则表达式匹配的位置
    SELECT REGEXP_INSTR(column, 'pattern') AS position FROM table_name;
  9. 梧桐 6.0 替代方案: 梧桐DB没有直接的替代函数,可以使用 POSITIONREGEXP_MATCHES 结合实现。
  10. -- 返回正则表达式匹配的位置
    SELECT POSITION((REGEXP_MATCHES(column, 'pattern'))[1] IN column) AS position FROM table_name;
  11. REGEXP_SUBSTR(): 返回匹配正则表达式的子字符串
  12. MySQL 8.0:
  13. -- 返回匹配正则表达式的子字符串
    SELECT REGEXP_SUBSTR(column, 'pattern') AS substring FROM table_name;
  14. 梧桐 6.0 替代方案:
  15. -- 返回匹配正则表达式的子字符串
    SELECT (REGEXP_MATCHES(column, 'pattern'))[1] AS substring FROM table_name;
  16. REGEXP_REPLACE(): 用正则表达式替换字符串中的匹配部分
  17. MySQL 8.0:
  18. -- 用正则表达式替换字符串中的匹配部分
    SELECT REGEXP_REPLACE(column, 'pattern', 'replacement') AS replaced_column FROM table_name;
  19. 梧桐 6.0 替代方案:
  20. -- 用正则表达式替换字符串中的匹配部分
    SELECT REGEXP_REPLACE(column, 'pattern', 'replacement') AS replaced_column FROM table_name;

地理空间函数:

  1. ST_DISTANCE_SPHERE(): 计算球面上两点之间的距离
  2. MySQL 8.0:
  3. -- 计算球面上两点之间的距离
    SELECT ST_DISTANCE_SPHERE(POINT(-71.060316, 48.432044), POINT(-71.055017, 48.431664));
  4. 梧桐 6.0 替代方案:
  5. -- 计算球面上两点之间的距离
    SELECT ST_Distance_Sphere(ST_MakePoint(-71.060316, 48.432044), ST_MakePoint(-71.055017, 48.431664));
  6. ST_MAKEENVELOPE(): 创建一个矩形包络
  7. MySQL 8.0:
  8. -- 创建一个矩形包络
    SELECT ST_MAKEENVELOPE(-71.060316, 48.432044, -71.055017, 48.431664);
  9. 梧桐 6.0 替代方案:
  10. -- 创建一个矩形包络
    SELECT ST_MakeEnvelope(-71.060316, 48.432044, -71.055017, 48.431664);
  11. ST_MAKEPOINT(): 创建一个点
  12. MySQL 8.0:
  13. -- 创建一个点
    SELECT ST_MAKEPOINT(-71.060316, 48.432044);
  14. 梧桐 6.0 替代方案:
  15. -- 创建一个点
    SELECT ST_MakePoint(-71.060316, 48.432044);
  16. ST_TRANSFORM(): 变换几何对象的坐标系
  17. MySQL 8.0:
  18. -- 变换几何对象的坐标系
    SELECT ST_TRANSFORM(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  19. 梧桐 6.0 替代方案:
  20. -- 变换几何对象的坐标系
    SELECT ST_Transform(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  21. ST_GEOMFROMGEOJSON(): 从GeoJSON创建几何对象
  22. MySQL 8.0:
  23. -- 从GeoJSON创建几何对象
    SELECT ST_GEOMFROMGEOJSON('{"type": "Point", "coordinates": [48.432044, -71.060316]}');
  24. 梧桐 6.0 替代方案:
  25. -- 从GeoJSON创建几何对象
    SELECT ST_GeomFromGeoJSON('{"type": "Point", "coordinates": [48.432044, -71.060316]}');
  26. ST_ASGEOJSON(): 将几何对象转换为GeoJSON
  27. MySQL 8.0:
  28. -- 将几何对象转换为GeoJSON
    SELECT ST_ASGEOJSON(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  29. 梧桐 6.0 替代方案:
  30. -- 将几何对象转换为GeoJSON
    SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  31. ST_ISVALID(): 检查几何对象是否有效
  32. MySQL 8.0:
  33. -- 检查几何对象是否有效
    SELECT ST_ISVALID(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  34. 梧桐 6.0 替代方案:
  35. -- 检查几何对象是否有效
    SELECT ST_IsValid(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  36. ST_ASTEXT(): 将几何对象转换为文本
  37. MySQL 8.0:
  38. -- 将几何对象转换为文本
    SELECT ST_ASTEXT(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  39. 梧桐 6.0 替代方案:
  40. -- 将几何对象转换为文本
    SELECT ST_AsText(ST_GeomFromText('POINT(-71.060316 48.432044)'));
  41. ST_SRID(): 返回几何对象的空间参考系统标识符
  42. MySQL 8.0:
  43. -- 返回几何对象的空间参考系统标识符
    SELECT ST_SRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));
  44. 梧桐 6.0 替代方案:
  45. -- 返回几何对象的空间参考系统标识符
    SELECT ST_SRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));
  46. ST_SETSRID(): 设置几何对象的空间参考系统标识符
  47. MySQL 8.0:
  48. -- 设置几何对象的空间参考系统标识符
    SELECT ST_SETSRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  49. 梧桐 6.0 替代方案:
  50. -- 设置几何对象的空间参考系统标识符
    SELECT ST_SetSRID(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 3857);
  51. ST_DISTANCE(): 计算两几何对象之间的距离
  52. MySQL 8.0:
  53. -- 计算两几何对象之间的距离
    SELECT ST_DISTANCE(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POINT(-71.055017 48.431664)'));
  54. 梧桐 6.0 替代方案:
  55. -- 计算两几何对象之间的距离
    SELECT ST_Distance(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POINT(-71.055017 48.431664)'));
  56. ST_INTERSECTS(): 检查两几何对象是否相交
  57. MySQL 8.0:
  58. -- 检查两几何对象是否相交
    SELECT ST_INTERSECTS(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POLYGON((0 0, 1 1, 1 0, 0 0))'));
  59. 梧桐 6.0 替代方案:
  60. -- 检查两几何对象是否相交
    SELECT ST_Intersects(ST_GeomFromText('POINT(-71.060316 48.432044)'), ST_GeomFromText('POLYGON((0 0, 1 1, 1 0, 0 0))'));

以上内容涵盖了MySQL 8.0中大部份特有的JSON函数、正则表达式函数和地理空间函数,同时提供了梧桐 6.0版本中的对应替代解决方案。

相关推荐

【推荐】一款开源免费、美观实用的后台管理系统模版

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

Android架构组件-App架构指南,你还不收藏嘛

本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

flutter系列之:UI layout简介(flutter ui设计)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

iOS的布局体系-流式布局MyFlowLayout

iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

WinForm实现窗体自适应缩放(winform窗口缩放)

众所周知,...

winform项目——仿QQ即时通讯程序03:搭建登录界面

上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

App自动化测试|原生app元素定位方法

元素定位方法介绍及应用Appium方法定位原生app元素...

61.C# TableLayoutPanel控件(c# tabcontrol)

摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

想要深入学习Android性能优化?看完这篇直接让你一步到位

...

12个python数据处理常用内置函数(python 的内置函数)

在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

Python入门知识点总结,Python三大数据类型、数据结构、控制流

Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...