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

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

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

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版本中的对应替代解决方案。

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...