[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-mariadb-mysql-to-mariadb":3,"mdc--w00rya-key":34,"related-org-mariadb-mysql-to-mariadb":2214,"related-repo-mariadb-mysql-to-mariadb":2311},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"mysql-to-mariadb","migrate applications from MySQL to MariaDB","Compatibility guide for developers moving from MySQL to MariaDB, and for developers with MySQL experience working with MariaDB. Use when migrating a MySQL application to MariaDB, when MySQL syntax or habits cause unexpected behavior in MariaDB, when asking about MySQL\u002FMariaDB compatibility, or when adapting code written for MySQL to run on MariaDB. IMPORTANT — MariaDB diverges significantly from MySQL 8.0 and is not a simple drop-in replacement for modern MySQL. Authentication plugins, JSON handling, GTID replication, and several SQL features differ in important ways.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"mariadb","MariaDB","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmariadb.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"MySQL","mysql","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Database","database",{"name":21,"slug":22,"type":15},"Migration","migration",9,"https:\u002F\u002Fgithub.com\u002FMariaDB\u002Fskills","2026-07-13T06:14:08.675338",null,2,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"MariaDB skills for Claude Code and AI agents - because it is not MySQL","https:\u002F\u002Fgithub.com\u002FMariaDB\u002Fskills\u002Ftree\u002FHEAD\u002Fmysql-to-mariadb","---\nname: mysql-to-mariadb\ndescription: \"Compatibility guide for developers moving from MySQL to MariaDB, and for developers with MySQL experience working with MariaDB. Use when migrating a MySQL application to MariaDB, when MySQL syntax or habits cause unexpected behavior in MariaDB, when asking about MySQL\u002FMariaDB compatibility, or when adapting code written for MySQL to run on MariaDB. IMPORTANT — MariaDB diverges significantly from MySQL 8.0 and is not a simple drop-in replacement for modern MySQL. Authentication plugins, JSON handling, GTID replication, and several SQL features differ in important ways.\"\n---\n\n# MySQL to MariaDB Migration Guide\n\n*Last updated: 2026-06-04*\n\n## Critical: MariaDB Is Not a Drop-In Replacement for MySQL 8.0\n\nMariaDB was a true drop-in replacement for MySQL 5.5 and 5.6. Modern versions diverge significantly from MySQL 8.0. When working with MariaDB, never assume MySQL 8.0 behavior, syntax, or tooling applies without verification.\n\nThe two databases share a common origin but have evolved independently. MariaDB has features MySQL lacks, MySQL has features MariaDB lacks, and several shared features behave differently.\n\n> **Requires:** MariaDB Community Server 10.5+ for full feature parity discussed here. Current LTS is 11.8 (GA May 2025).\n>\n> **Default context:** Assume MariaDB **11.8 LTS** unless the user states another version. Features marked **12.x** or **13.0** may be suggested when relevant (including as upgrade options), but always state the minimum version — do not present them as available on 11.8.\n\n### What LLMs Get Wrong\n\n| What you might see | What's correct |\n|---|---|\n| \"MariaDB is a drop-in replacement for MySQL\" | True for MySQL 5.5\u002F5.6. Not true for MySQL 8.0+ — authentication, JSON, GTID, and several functions differ |\n| Code using `caching_sha2_password` | Available in MariaDB: a migration-only plugin since 11.4, and a full `caching_sha2_password` authentication plugin for MySQL compatibility since 12.1 (MDEV-9804). Not the default — on older MariaDB or stock installs use `mysql_native_password` or `ed25519` |\n| `JSON_TABLE()` in queries | Available in MariaDB since 10.6 — not available before 10.6 |\n| JSON `->` and `->>` shorthand operators | Not supported in MariaDB — use `JSON_EXTRACT(col, '$.key')` and `JSON_UNQUOTE(JSON_EXTRACT(...))` instead |\n| `utf8mb4_0900_ai_ci` collation in schema or dump | Supported since MariaDB 11.4.5 (as alias for `utf8mb4_uca1400_nopad_ai_ci`). On older versions replace with `utf8mb4_unicode_ci` before importing. MariaDB 11.5+ uses `uca1400_ai_ci` as the default Unicode collation (MDEV-25829). |\n| `latin1` as default character set in MariaDB | Changed to `utf8mb4` by default in 11.6+ (MDEV-19123); old habits assuming `latin1` no longer apply for fresh installs |\n| Using `UUID()` for primary keys | MariaDB 11.7+ has `UUID_v7()` for time-ordered UUIDs (sortable, better for indexed PKs) and `UUID_v4()` for random; both unique to MariaDB |\n| Not suggesting `RETURNING` for INSERT\u002FUPDATE\u002FDELETE | MariaDB 10.5+ supports `RETURNING` — use it to get inserted\u002Fupdated\u002Fdeleted rows without a second query |\n| Not suggesting `CREATE SEQUENCE` | MariaDB has native sequence objects; MySQL has no equivalent |\n| MySQL GTID replication syntax | MariaDB GTID format is incompatible with MySQL GTID — replication between the two breaks |\n| `CHANGE REPLICATION SOURCE TO` \u002F `SOURCE_*` options | MariaDB has no `CHANGE REPLICATION SOURCE TO` — use `CHANGE MASTER TO` with `MASTER_*` options. Since 10.5.1, `START REPLICA` \u002F `SHOW REPLICA STATUS` are canonical; `START SLAVE` \u002F `SHOW SLAVE STATUS` are legacy aliases |\n| MySQL parallel replication (`replica_parallel_type` with `DATABASE` \u002F `LOGICAL_CLOCK`) | MariaDB uses `slave_parallel_mode` (`optimistic` \u002F `conservative` \u002F `aggressive` \u002F `minimal` \u002F `none`) — different implementation; mode configs do not port over. Pool size: `slave_parallel_threads` (alias `slave_parallel_workers`) |\n| `SET transaction_isolation = ...` (MySQL 8.0 style) | Only works on MariaDB 11.1.1+; on older versions use `tx_isolation` instead — see [SET TRANSACTION](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-statements\u002Fadministrative-sql-statements\u002Fset-commands\u002Fset-transaction) |\n| Links or references to `mariadb.com\u002Fkb\u002Fen\u002F` | The Knowledge Base no longer exists — all documentation is now at [mariadb.com\u002Fdocs](https:\u002F\u002Fmariadb.com\u002Fdocs) |\n| Keeping the MySQL Connector\u002FJ, `mysql2`, or other MySQL client drivers after migration | Use MariaDB-maintained connectors (JDBC, Node.js, C, etc.) where possible — they target MariaDB protocol and feature behaviour, not only MySQL compatibility mode |\n| Migrating by copying InnoDB data files \u002F tablespaces from MySQL 8.0 | MariaDB has no transactional data dictionary and cannot read MySQL 8.0's — data files are not portable. Use a logical dump\u002Frestore — see [Data Dictionary Architecture](#data-dictionary-architecture) |\n\n## Authentication\n\nMySQL 8.0 changed its default authentication plugin to `caching_sha2_password`. MariaDB's compatibility story has improved over time:\n\n- **MariaDB 11.4+**: a migration-only `caching_sha2_password` plugin exists but is not installed by default and not recommended for production\n- **MariaDB 12.1+** (MDEV-9804): a full `caching_sha2_password` authentication plugin for MySQL compatibility — still not the default, but a proper production option\n\nOn stock MariaDB installs, connections configured for `caching_sha2_password` will still fail unless the plugin is enabled. Default authentication remains `mysql_native_password`.\n\n**Fix on older MariaDB or stock setups:** convert accounts to `mysql_native_password`:\n```sql\nALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';\n```\n\nThe `ed25519` plugin is also available as a more secure native alternative.\n\n## JSON Differences\n\nMariaDB and MySQL handle JSON differently:\n\n| Aspect | MySQL | MariaDB |\n|---|---|---|\n| Storage | Binary format with path indexing | `LONGTEXT` alias with validity check |\n| `JSON_TABLE()` | Supported | Supported from MariaDB 10.6 |\n| `IS JSON` predicate | Not available | Available from MariaDB 12.3 |\n| JSON comparison | Semantic (compares values) | String comparison |\n| `JSON_QUERY()` | Not available | MariaDB alternative to `JSON_VALUE` |\n| JSON nesting depth limit | None | 32 in older MariaDB; removed in 12.2+ |\n| `JSON_EQUALS()` \u002F `JSON_NORMALIZE()` | Supported (8.0.22+) | MariaDB 10.7+ (MDEV-23143 \u002F MDEV-16375) |\n| `JSON_OVERLAPS()` | Supported (8.0.17+) | MariaDB 10.9+ (MDEV-27677) |\n| Negative \u002F `last` \u002F range JSON path indices (`$.A[-1]`, `$.A[last]`, `$.A[1 to 3]`) | Not supported | MariaDB 10.9+ |\n| `JSON_SCHEMA_VALID()` | Supported (8.0.17+) | MariaDB 11.4 LTS+ |\n\nMariaDB closed most of the JSON function gap with MySQL 8.0 between 10.7 and 11.4. MariaDB-specific additions that MySQL still lacks: `JSON_KEY_VALUE()`, `JSON_ARRAY_INTERSECT()`, `JSON_OBJECT_TO_ARRAY()`, `JSON_OBJECT_FILTER_KEYS()` (11.4+), and the `JSON_QUERY()` alias.\n\nMariaDB's JSON is fully standards-compliant, but MySQL-specific storage layout, the `->`\u002F`->>` shorthand operators, and the `JSON_SCHEMA_VALIDATION_REPORT()` function do not transfer.\n\n## Features MariaDB Has That MySQL Doesn't\n\nThese exist in MariaDB but not MySQL — LLMs won't suggest them because they assume MySQL behavior:\n\n- **`RETURNING`** — get rows back from `INSERT` or `DELETE` without a second query (10.5+); `UPDATE ... RETURNING` available from 13.0:\n  ```sql\n  INSERT INTO orders (product, qty) VALUES ('widget', 5) RETURNING id, created_at;\n  DELETE FROM queue WHERE processed = 1 RETURNING id;\n  ```\n- **`CREATE SEQUENCE`** (10.3+) — first-class sequence objects, more flexible than `AUTO_INCREMENT`:\n  ```sql\n  CREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1;\n  SELECT NEXT VALUE FOR order_seq;\n  ```\n- **`WITH SYSTEM VERSIONING`** (10.3+) — temporal tables that automatically track row history:\n  ```sql\n  CREATE TABLE prices (\n      item VARCHAR(100),\n      price DECIMAL(10,2)\n  ) WITH SYSTEM VERSIONING;\n  -- Query historical data:\n  SELECT * FROM prices FOR SYSTEM_TIME AS OF '2025-01-01';\n  ```\n- **`LIMIT` in subqueries** — MariaDB supports `LIMIT` inside subqueries; MySQL restricts this\n- **Atomic `CREATE OR REPLACE TABLE`** (13.0+) — the statement is fully atomic in MariaDB; MySQL has no atomic equivalent\n- **Galera Cluster** — built-in multi-master clustering, no plugin required\n- **Stored procedure syntax differences** — both support stored procedures, but MariaDB's SQL\u002FPSM syntax differs from MySQL in `HANDLER`, `CURSOR`, and `CONDITION` declarations; AI agents frequently generate incorrect MariaDB stored procedure code — see [Stored Procedures — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-usage\u002Fstored-routines\u002Fstored-procedures)\n- **Native data types MySQL 8.0 lacks** — [`INET6`](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Finet6) (10.5+) and [`INET4`](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Finet4) (10.10+) for IP address storage and comparison; [`UUID`](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Fuuid-data-type) (10.7+; MySQL stores UUIDs in `BINARY(16)` or `CHAR(36)`); [`VECTOR`](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Fvectors\u002Fvector) for embeddings and similarity search (11.7+; MySQL added a vector type only in its 9.x innovation series, not in 8.0)\n- **`UUID_v4()` and `UUID_v7()` functions** (11.7+) — MariaDB-specific; MySQL only has the original `UUID()`. `UUID_v7()` is time-ordered (RFC 9562) and is the right choice for UUID primary keys\n- **`FORMAT_BYTES()`** (11.8+) — convert byte counts to human-readable strings; not in MySQL\n\n## Features MySQL Has That MariaDB Doesn't\n\nThese exist in MySQL 8.0 but not in MariaDB — code using them needs adaptation:\n\n- **`JSON_TABLE()`** — available since MariaDB 10.6; on older versions rewrite using MariaDB JSON functions or application-level parsing\n- **`sys` schema** — available since MariaDB 10.6; not available in older versions\n- **MySQL 8 GIS functions** (`ST_Validate`, `MBRCoveredBy`, `ST_Simplify`, `ST_GeoHash`, `ST_LatFromGeoHash`, `ST_LongFromGeoHash`, `ST_PointFromGeoHash`, `ST_IsValid`, `ST_Collect`) — added in MariaDB 12.0 for MySQL compatibility\n- **`caching_sha2_password` as default plugin** — available as an opt-in plugin from MariaDB 12.1; on older or stock setups, use `mysql_native_password` or `ed25519`\n- **JSON `->` and `->>` operators** — use `JSON_EXTRACT(col, '$.key')` and `JSON_UNQUOTE(JSON_EXTRACT(...))` instead\n- **`utf8mb4_0900_ai_ci` collation** — supported since MariaDB 11.4.5 (alias for `utf8mb4_uca1400_nopad_ai_ci`); on older versions replace with `utf8mb4_unicode_ci` before importing\n\n## Data Dictionary Architecture\n\nMySQL 8.0 and MariaDB store table metadata in fundamentally different ways, and this affects how you migrate:\n\n- **MySQL 8.0** keeps all object metadata in a [transactional data dictionary](https:\u002F\u002Fdev.mysql.com\u002Fdoc\u002Frefman\u002F8.0\u002Fen\u002Fdata-dictionary.html) stored in InnoDB (`mysql.ibd`), and **removed the per-table `.frm` files**.\n- **MariaDB** keeps the file-based approach — a `.frm` file per table plus storage-engine metadata — and has no transactional data dictionary. (MariaDB grant tables use the Aria engine; MySQL 8.0 holds system tables in the InnoDB dictionary.)\n\nPractical consequences:\n\n- **Do not migrate by copying data files.** InnoDB tablespaces and datadir files are **not** portable between MySQL 8.0 and MariaDB — the dictionary formats are incompatible. Use a logical dump\u002Frestore instead. MariaDB's [migration guide](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-management\u002Finstall-and-upgrade-mariadb\u002Fmigrating-to-mariadb\u002Fmoving-from-mysql\u002Fmysql-to-mariadb-migration-the-master-guide) recommends MySQL's own `mysqldump` for this direction (not `mariadb-dump`, which isn't well tested against MySQL), dumping named databases rather than `--all-databases` so MySQL's system tables aren't imported.\n- **No in-place downgrade** from MySQL 8.0 to MariaDB — MariaDB cannot read MySQL's data dictionary; a logical export\u002Fimport is required.\n- **`INFORMATION_SCHEMA` is implemented differently** — MySQL 8.0 queries indexed dictionary tables, while MariaDB builds I_S views dynamically; metadata-heavy queries against I_S can have different performance characteristics, so don't assume MySQL 8.0 timings carry over.\n\n## Optimizer Differences\n\nMariaDB and MySQL use different query optimizers with different cost models. Identical SQL can produce different execution plans. After migration:\n\n- Re-run `EXPLAIN` on critical queries — do not assume execution plans transfer\n- Index hints that work in MySQL may not be needed (or may differ) in MariaDB\n- MariaDB's optimizer is more aggressively tunable via `optimizer_switch`\n\n## Version Compatibility Quick Reference\n\n| MySQL version | MariaDB equivalent | Drop-in? |\n|---|---|---|\n| 5.5 | 5.5 | Yes |\n| 5.6 | 10.0–10.1 | Mostly |\n| 5.7 | 10.2–10.4 | Limited |\n| 8.0 | 10.5+ | No — significant differences |\n\n## Sources\n\n- [MariaDB vs MySQL Compatibility — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Frelease-notes\u002Fcommunity-server\u002Fabout\u002Fcompatibility-and-differences\u002Fmariadb-vs-mysql-compatibility)\n- [Moving from MySQL to MariaDB — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-management\u002Finstall-and-upgrade-mariadb\u002Fmigrating-to-mariadb\u002Fmoving-from-mysql\u002F)\n- [MDEV-28906 — MySQL 8.0 desired compatibility (Jira epic)](https:\u002F\u002Fjira.mariadb.org\u002Fbrowse\u002FMDEV-28906) — tracks MySQL 8.0 compatibility work; check individual sub-task status before assuming an item is still missing — closed sub-tasks mean the feature has been implemented\n- [RETURNING — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-statements\u002Fdata-manipulation\u002Finserting-loading-data\u002Finsertreturning)\n- [CREATE SEQUENCE — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Fsequences\u002Fcreate-sequence)\n- [System-Versioned Tables — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Ftemporal-tables\u002Fsystem-versioned-tables)\n- [Authentication Plugins — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fplugins\u002Fauthentication-plugins)\n\n*For topics not covered here, see the official MariaDB documentation at [mariadb.com\u002Fdocs](https:\u002F\u002Fmariadb.com\u002Fdocs).*\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,58,65,70,75,121,128,721,727,739,778,797,814,835,847,853,858,1135,1176,1203,1209,1214,1608,1614,1619,1812,1817,1822,1882,1887,1966,1972,1977,2009,2015,2113,2119,2194,2208],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"mysql-to-mariadb-migration-guide",[45],{"type":46,"value":47},"text","MySQL to MariaDB Migration Guide",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":40,"tag":53,"props":54,"children":55},"em",{},[56],{"type":46,"value":57},"Last updated: 2026-06-04",{"type":40,"tag":59,"props":60,"children":62},"h2",{"id":61},"critical-mariadb-is-not-a-drop-in-replacement-for-mysql-80",[63],{"type":46,"value":64},"Critical: MariaDB Is Not a Drop-In Replacement for MySQL 8.0",{"type":40,"tag":49,"props":66,"children":67},{},[68],{"type":46,"value":69},"MariaDB was a true drop-in replacement for MySQL 5.5 and 5.6. Modern versions diverge significantly from MySQL 8.0. When working with MariaDB, never assume MySQL 8.0 behavior, syntax, or tooling applies without verification.",{"type":40,"tag":49,"props":71,"children":72},{},[73],{"type":46,"value":74},"The two databases share a common origin but have evolved independently. MariaDB has features MySQL lacks, MySQL has features MariaDB lacks, and several shared features behave differently.",{"type":40,"tag":76,"props":77,"children":78},"blockquote",{},[79,90],{"type":40,"tag":49,"props":80,"children":81},{},[82,88],{"type":40,"tag":83,"props":84,"children":85},"strong",{},[86],{"type":46,"value":87},"Requires:",{"type":46,"value":89}," MariaDB Community Server 10.5+ for full feature parity discussed here. Current LTS is 11.8 (GA May 2025).",{"type":40,"tag":49,"props":91,"children":92},{},[93,98,100,105,107,112,114,119],{"type":40,"tag":83,"props":94,"children":95},{},[96],{"type":46,"value":97},"Default context:",{"type":46,"value":99}," Assume MariaDB ",{"type":40,"tag":83,"props":101,"children":102},{},[103],{"type":46,"value":104},"11.8 LTS",{"type":46,"value":106}," unless the user states another version. Features marked ",{"type":40,"tag":83,"props":108,"children":109},{},[110],{"type":46,"value":111},"12.x",{"type":46,"value":113}," or ",{"type":40,"tag":83,"props":115,"children":116},{},[117],{"type":46,"value":118},"13.0",{"type":46,"value":120}," may be suggested when relevant (including as upgrade options), but always state the minimum version — do not present them as available on 11.8.",{"type":40,"tag":122,"props":123,"children":125},"h3",{"id":124},"what-llms-get-wrong",[126],{"type":46,"value":127},"What LLMs Get Wrong",{"type":40,"tag":129,"props":130,"children":131},"table",{},[132,151],{"type":40,"tag":133,"props":134,"children":135},"thead",{},[136],{"type":40,"tag":137,"props":138,"children":139},"tr",{},[140,146],{"type":40,"tag":141,"props":142,"children":143},"th",{},[144],{"type":46,"value":145},"What you might see",{"type":40,"tag":141,"props":147,"children":148},{},[149],{"type":46,"value":150},"What's correct",{"type":40,"tag":152,"props":153,"children":154},"tbody",{},[155,169,209,228,272,315,349,386,414,432,445,525,619,655,681,702],{"type":40,"tag":137,"props":156,"children":157},{},[158,164],{"type":40,"tag":159,"props":160,"children":161},"td",{},[162],{"type":46,"value":163},"\"MariaDB is a drop-in replacement for MySQL\"",{"type":40,"tag":159,"props":165,"children":166},{},[167],{"type":46,"value":168},"True for MySQL 5.5\u002F5.6. Not true for MySQL 8.0+ — authentication, JSON, GTID, and several functions differ",{"type":40,"tag":137,"props":170,"children":171},{},[172,184],{"type":40,"tag":159,"props":173,"children":174},{},[175,177],{"type":46,"value":176},"Code using ",{"type":40,"tag":178,"props":179,"children":181},"code",{"className":180},[],[182],{"type":46,"value":183},"caching_sha2_password",{"type":40,"tag":159,"props":185,"children":186},{},[187,189,194,196,202,203],{"type":46,"value":188},"Available in MariaDB: a migration-only plugin since 11.4, and a full ",{"type":40,"tag":178,"props":190,"children":192},{"className":191},[],[193],{"type":46,"value":183},{"type":46,"value":195}," authentication plugin for MySQL compatibility since 12.1 (MDEV-9804). Not the default — on older MariaDB or stock installs use ",{"type":40,"tag":178,"props":197,"children":199},{"className":198},[],[200],{"type":46,"value":201},"mysql_native_password",{"type":46,"value":113},{"type":40,"tag":178,"props":204,"children":206},{"className":205},[],[207],{"type":46,"value":208},"ed25519",{"type":40,"tag":137,"props":210,"children":211},{},[212,223],{"type":40,"tag":159,"props":213,"children":214},{},[215,221],{"type":40,"tag":178,"props":216,"children":218},{"className":217},[],[219],{"type":46,"value":220},"JSON_TABLE()",{"type":46,"value":222}," in queries",{"type":40,"tag":159,"props":224,"children":225},{},[226],{"type":46,"value":227},"Available in MariaDB since 10.6 — not available before 10.6",{"type":40,"tag":137,"props":229,"children":230},{},[231,252],{"type":40,"tag":159,"props":232,"children":233},{},[234,236,242,244,250],{"type":46,"value":235},"JSON ",{"type":40,"tag":178,"props":237,"children":239},{"className":238},[],[240],{"type":46,"value":241},"->",{"type":46,"value":243}," and ",{"type":40,"tag":178,"props":245,"children":247},{"className":246},[],[248],{"type":46,"value":249},"->>",{"type":46,"value":251}," shorthand operators",{"type":40,"tag":159,"props":253,"children":254},{},[255,257,263,264,270],{"type":46,"value":256},"Not supported in MariaDB — use ",{"type":40,"tag":178,"props":258,"children":260},{"className":259},[],[261],{"type":46,"value":262},"JSON_EXTRACT(col, '$.key')",{"type":46,"value":243},{"type":40,"tag":178,"props":265,"children":267},{"className":266},[],[268],{"type":46,"value":269},"JSON_UNQUOTE(JSON_EXTRACT(...))",{"type":46,"value":271}," instead",{"type":40,"tag":137,"props":273,"children":274},{},[275,286],{"type":40,"tag":159,"props":276,"children":277},{},[278,284],{"type":40,"tag":178,"props":279,"children":281},{"className":280},[],[282],{"type":46,"value":283},"utf8mb4_0900_ai_ci",{"type":46,"value":285}," collation in schema or dump",{"type":40,"tag":159,"props":287,"children":288},{},[289,291,297,299,305,307,313],{"type":46,"value":290},"Supported since MariaDB 11.4.5 (as alias for ",{"type":40,"tag":178,"props":292,"children":294},{"className":293},[],[295],{"type":46,"value":296},"utf8mb4_uca1400_nopad_ai_ci",{"type":46,"value":298},"). On older versions replace with ",{"type":40,"tag":178,"props":300,"children":302},{"className":301},[],[303],{"type":46,"value":304},"utf8mb4_unicode_ci",{"type":46,"value":306}," before importing. MariaDB 11.5+ uses ",{"type":40,"tag":178,"props":308,"children":310},{"className":309},[],[311],{"type":46,"value":312},"uca1400_ai_ci",{"type":46,"value":314}," as the default Unicode collation (MDEV-25829).",{"type":40,"tag":137,"props":316,"children":317},{},[318,329],{"type":40,"tag":159,"props":319,"children":320},{},[321,327],{"type":40,"tag":178,"props":322,"children":324},{"className":323},[],[325],{"type":46,"value":326},"latin1",{"type":46,"value":328}," as default character set in MariaDB",{"type":40,"tag":159,"props":330,"children":331},{},[332,334,340,342,347],{"type":46,"value":333},"Changed to ",{"type":40,"tag":178,"props":335,"children":337},{"className":336},[],[338],{"type":46,"value":339},"utf8mb4",{"type":46,"value":341}," by default in 11.6+ (MDEV-19123); old habits assuming ",{"type":40,"tag":178,"props":343,"children":345},{"className":344},[],[346],{"type":46,"value":326},{"type":46,"value":348}," no longer apply for fresh installs",{"type":40,"tag":137,"props":350,"children":351},{},[352,365],{"type":40,"tag":159,"props":353,"children":354},{},[355,357,363],{"type":46,"value":356},"Using ",{"type":40,"tag":178,"props":358,"children":360},{"className":359},[],[361],{"type":46,"value":362},"UUID()",{"type":46,"value":364}," for primary keys",{"type":40,"tag":159,"props":366,"children":367},{},[368,370,376,378,384],{"type":46,"value":369},"MariaDB 11.7+ has ",{"type":40,"tag":178,"props":371,"children":373},{"className":372},[],[374],{"type":46,"value":375},"UUID_v7()",{"type":46,"value":377}," for time-ordered UUIDs (sortable, better for indexed PKs) and ",{"type":40,"tag":178,"props":379,"children":381},{"className":380},[],[382],{"type":46,"value":383},"UUID_v4()",{"type":46,"value":385}," for random; both unique to MariaDB",{"type":40,"tag":137,"props":387,"children":388},{},[389,402],{"type":40,"tag":159,"props":390,"children":391},{},[392,394,400],{"type":46,"value":393},"Not suggesting ",{"type":40,"tag":178,"props":395,"children":397},{"className":396},[],[398],{"type":46,"value":399},"RETURNING",{"type":46,"value":401}," for INSERT\u002FUPDATE\u002FDELETE",{"type":40,"tag":159,"props":403,"children":404},{},[405,407,412],{"type":46,"value":406},"MariaDB 10.5+ supports ",{"type":40,"tag":178,"props":408,"children":410},{"className":409},[],[411],{"type":46,"value":399},{"type":46,"value":413}," — use it to get inserted\u002Fupdated\u002Fdeleted rows without a second query",{"type":40,"tag":137,"props":415,"children":416},{},[417,427],{"type":40,"tag":159,"props":418,"children":419},{},[420,421],{"type":46,"value":393},{"type":40,"tag":178,"props":422,"children":424},{"className":423},[],[425],{"type":46,"value":426},"CREATE SEQUENCE",{"type":40,"tag":159,"props":428,"children":429},{},[430],{"type":46,"value":431},"MariaDB has native sequence objects; MySQL has no equivalent",{"type":40,"tag":137,"props":433,"children":434},{},[435,440],{"type":40,"tag":159,"props":436,"children":437},{},[438],{"type":46,"value":439},"MySQL GTID replication syntax",{"type":40,"tag":159,"props":441,"children":442},{},[443],{"type":46,"value":444},"MariaDB GTID format is incompatible with MySQL GTID — replication between the two breaks",{"type":40,"tag":137,"props":446,"children":447},{},[448,467],{"type":40,"tag":159,"props":449,"children":450},{},[451,457,459,465],{"type":40,"tag":178,"props":452,"children":454},{"className":453},[],[455],{"type":46,"value":456},"CHANGE REPLICATION SOURCE TO",{"type":46,"value":458}," \u002F ",{"type":40,"tag":178,"props":460,"children":462},{"className":461},[],[463],{"type":46,"value":464},"SOURCE_*",{"type":46,"value":466}," options",{"type":40,"tag":159,"props":468,"children":469},{},[470,472,477,479,485,487,493,495,501,502,508,510,516,517,523],{"type":46,"value":471},"MariaDB has no ",{"type":40,"tag":178,"props":473,"children":475},{"className":474},[],[476],{"type":46,"value":456},{"type":46,"value":478}," — use ",{"type":40,"tag":178,"props":480,"children":482},{"className":481},[],[483],{"type":46,"value":484},"CHANGE MASTER TO",{"type":46,"value":486}," with ",{"type":40,"tag":178,"props":488,"children":490},{"className":489},[],[491],{"type":46,"value":492},"MASTER_*",{"type":46,"value":494}," options. Since 10.5.1, ",{"type":40,"tag":178,"props":496,"children":498},{"className":497},[],[499],{"type":46,"value":500},"START REPLICA",{"type":46,"value":458},{"type":40,"tag":178,"props":503,"children":505},{"className":504},[],[506],{"type":46,"value":507},"SHOW REPLICA STATUS",{"type":46,"value":509}," are canonical; ",{"type":40,"tag":178,"props":511,"children":513},{"className":512},[],[514],{"type":46,"value":515},"START SLAVE",{"type":46,"value":458},{"type":40,"tag":178,"props":518,"children":520},{"className":519},[],[521],{"type":46,"value":522},"SHOW SLAVE STATUS",{"type":46,"value":524}," are legacy aliases",{"type":40,"tag":137,"props":526,"children":527},{},[528,555],{"type":40,"tag":159,"props":529,"children":530},{},[531,533,539,540,546,547,553],{"type":46,"value":532},"MySQL parallel replication (",{"type":40,"tag":178,"props":534,"children":536},{"className":535},[],[537],{"type":46,"value":538},"replica_parallel_type",{"type":46,"value":486},{"type":40,"tag":178,"props":541,"children":543},{"className":542},[],[544],{"type":46,"value":545},"DATABASE",{"type":46,"value":458},{"type":40,"tag":178,"props":548,"children":550},{"className":549},[],[551],{"type":46,"value":552},"LOGICAL_CLOCK",{"type":46,"value":554},")",{"type":40,"tag":159,"props":556,"children":557},{},[558,560,566,568,574,575,581,582,588,589,595,596,602,604,610,612,618],{"type":46,"value":559},"MariaDB uses ",{"type":40,"tag":178,"props":561,"children":563},{"className":562},[],[564],{"type":46,"value":565},"slave_parallel_mode",{"type":46,"value":567}," (",{"type":40,"tag":178,"props":569,"children":571},{"className":570},[],[572],{"type":46,"value":573},"optimistic",{"type":46,"value":458},{"type":40,"tag":178,"props":576,"children":578},{"className":577},[],[579],{"type":46,"value":580},"conservative",{"type":46,"value":458},{"type":40,"tag":178,"props":583,"children":585},{"className":584},[],[586],{"type":46,"value":587},"aggressive",{"type":46,"value":458},{"type":40,"tag":178,"props":590,"children":592},{"className":591},[],[593],{"type":46,"value":594},"minimal",{"type":46,"value":458},{"type":40,"tag":178,"props":597,"children":599},{"className":598},[],[600],{"type":46,"value":601},"none",{"type":46,"value":603},") — different implementation; mode configs do not port over. Pool size: ",{"type":40,"tag":178,"props":605,"children":607},{"className":606},[],[608],{"type":46,"value":609},"slave_parallel_threads",{"type":46,"value":611}," (alias ",{"type":40,"tag":178,"props":613,"children":615},{"className":614},[],[616],{"type":46,"value":617},"slave_parallel_workers",{"type":46,"value":554},{"type":40,"tag":137,"props":620,"children":621},{},[622,633],{"type":40,"tag":159,"props":623,"children":624},{},[625,631],{"type":40,"tag":178,"props":626,"children":628},{"className":627},[],[629],{"type":46,"value":630},"SET transaction_isolation = ...",{"type":46,"value":632}," (MySQL 8.0 style)",{"type":40,"tag":159,"props":634,"children":635},{},[636,638,644,646],{"type":46,"value":637},"Only works on MariaDB 11.1.1+; on older versions use ",{"type":40,"tag":178,"props":639,"children":641},{"className":640},[],[642],{"type":46,"value":643},"tx_isolation",{"type":46,"value":645}," instead — see ",{"type":40,"tag":647,"props":648,"children":652},"a",{"href":649,"rel":650},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-statements\u002Fadministrative-sql-statements\u002Fset-commands\u002Fset-transaction",[651],"nofollow",[653],{"type":46,"value":654},"SET TRANSACTION",{"type":40,"tag":137,"props":656,"children":657},{},[658,669],{"type":40,"tag":159,"props":659,"children":660},{},[661,663],{"type":46,"value":662},"Links or references to ",{"type":40,"tag":178,"props":664,"children":666},{"className":665},[],[667],{"type":46,"value":668},"mariadb.com\u002Fkb\u002Fen\u002F",{"type":40,"tag":159,"props":670,"children":671},{},[672,674],{"type":46,"value":673},"The Knowledge Base no longer exists — all documentation is now at ",{"type":40,"tag":647,"props":675,"children":678},{"href":676,"rel":677},"https:\u002F\u002Fmariadb.com\u002Fdocs",[651],[679],{"type":46,"value":680},"mariadb.com\u002Fdocs",{"type":40,"tag":137,"props":682,"children":683},{},[684,697],{"type":40,"tag":159,"props":685,"children":686},{},[687,689,695],{"type":46,"value":688},"Keeping the MySQL Connector\u002FJ, ",{"type":40,"tag":178,"props":690,"children":692},{"className":691},[],[693],{"type":46,"value":694},"mysql2",{"type":46,"value":696},", or other MySQL client drivers after migration",{"type":40,"tag":159,"props":698,"children":699},{},[700],{"type":46,"value":701},"Use MariaDB-maintained connectors (JDBC, Node.js, C, etc.) where possible — they target MariaDB protocol and feature behaviour, not only MySQL compatibility mode",{"type":40,"tag":137,"props":703,"children":704},{},[705,710],{"type":40,"tag":159,"props":706,"children":707},{},[708],{"type":46,"value":709},"Migrating by copying InnoDB data files \u002F tablespaces from MySQL 8.0",{"type":40,"tag":159,"props":711,"children":712},{},[713,715],{"type":46,"value":714},"MariaDB has no transactional data dictionary and cannot read MySQL 8.0's — data files are not portable. Use a logical dump\u002Frestore — see ",{"type":40,"tag":647,"props":716,"children":718},{"href":717},"#data-dictionary-architecture",[719],{"type":46,"value":720},"Data Dictionary Architecture",{"type":40,"tag":59,"props":722,"children":724},{"id":723},"authentication",[725],{"type":46,"value":726},"Authentication",{"type":40,"tag":49,"props":728,"children":729},{},[730,732,737],{"type":46,"value":731},"MySQL 8.0 changed its default authentication plugin to ",{"type":40,"tag":178,"props":733,"children":735},{"className":734},[],[736],{"type":46,"value":183},{"type":46,"value":738},". MariaDB's compatibility story has improved over time:",{"type":40,"tag":740,"props":741,"children":742},"ul",{},[743,761],{"type":40,"tag":744,"props":745,"children":746},"li",{},[747,752,754,759],{"type":40,"tag":83,"props":748,"children":749},{},[750],{"type":46,"value":751},"MariaDB 11.4+",{"type":46,"value":753},": a migration-only ",{"type":40,"tag":178,"props":755,"children":757},{"className":756},[],[758],{"type":46,"value":183},{"type":46,"value":760}," plugin exists but is not installed by default and not recommended for production",{"type":40,"tag":744,"props":762,"children":763},{},[764,769,771,776],{"type":40,"tag":83,"props":765,"children":766},{},[767],{"type":46,"value":768},"MariaDB 12.1+",{"type":46,"value":770}," (MDEV-9804): a full ",{"type":40,"tag":178,"props":772,"children":774},{"className":773},[],[775],{"type":46,"value":183},{"type":46,"value":777}," authentication plugin for MySQL compatibility — still not the default, but a proper production option",{"type":40,"tag":49,"props":779,"children":780},{},[781,783,788,790,795],{"type":46,"value":782},"On stock MariaDB installs, connections configured for ",{"type":40,"tag":178,"props":784,"children":786},{"className":785},[],[787],{"type":46,"value":183},{"type":46,"value":789}," will still fail unless the plugin is enabled. Default authentication remains ",{"type":40,"tag":178,"props":791,"children":793},{"className":792},[],[794],{"type":46,"value":201},{"type":46,"value":796},".",{"type":40,"tag":49,"props":798,"children":799},{},[800,805,807,812],{"type":40,"tag":83,"props":801,"children":802},{},[803],{"type":46,"value":804},"Fix on older MariaDB or stock setups:",{"type":46,"value":806}," convert accounts to ",{"type":40,"tag":178,"props":808,"children":810},{"className":809},[],[811],{"type":46,"value":201},{"type":46,"value":813},":",{"type":40,"tag":815,"props":816,"children":821},"pre",{"className":817,"code":818,"language":819,"meta":820,"style":820},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';\n","sql","",[822],{"type":40,"tag":178,"props":823,"children":824},{"__ignoreMap":820},[825],{"type":40,"tag":826,"props":827,"children":830},"span",{"class":828,"line":829},"line",1,[831],{"type":40,"tag":826,"props":832,"children":833},{},[834],{"type":46,"value":818},{"type":40,"tag":49,"props":836,"children":837},{},[838,840,845],{"type":46,"value":839},"The ",{"type":40,"tag":178,"props":841,"children":843},{"className":842},[],[844],{"type":46,"value":208},{"type":46,"value":846}," plugin is also available as a more secure native alternative.",{"type":40,"tag":59,"props":848,"children":850},{"id":849},"json-differences",[851],{"type":46,"value":852},"JSON Differences",{"type":40,"tag":49,"props":854,"children":855},{},[856],{"type":46,"value":857},"MariaDB and MySQL handle JSON differently:",{"type":40,"tag":129,"props":859,"children":860},{},[861,880],{"type":40,"tag":133,"props":862,"children":863},{},[864],{"type":40,"tag":137,"props":865,"children":866},{},[867,872,876],{"type":40,"tag":141,"props":868,"children":869},{},[870],{"type":46,"value":871},"Aspect",{"type":40,"tag":141,"props":873,"children":874},{},[875],{"type":46,"value":13},{"type":40,"tag":141,"props":877,"children":878},{},[879],{"type":46,"value":9},{"type":40,"tag":152,"props":881,"children":882},{},[883,907,928,952,970,997,1015,1044,1066,1114],{"type":40,"tag":137,"props":884,"children":885},{},[886,891,896],{"type":40,"tag":159,"props":887,"children":888},{},[889],{"type":46,"value":890},"Storage",{"type":40,"tag":159,"props":892,"children":893},{},[894],{"type":46,"value":895},"Binary format with path indexing",{"type":40,"tag":159,"props":897,"children":898},{},[899,905],{"type":40,"tag":178,"props":900,"children":902},{"className":901},[],[903],{"type":46,"value":904},"LONGTEXT",{"type":46,"value":906}," alias with validity check",{"type":40,"tag":137,"props":908,"children":909},{},[910,918,923],{"type":40,"tag":159,"props":911,"children":912},{},[913],{"type":40,"tag":178,"props":914,"children":916},{"className":915},[],[917],{"type":46,"value":220},{"type":40,"tag":159,"props":919,"children":920},{},[921],{"type":46,"value":922},"Supported",{"type":40,"tag":159,"props":924,"children":925},{},[926],{"type":46,"value":927},"Supported from MariaDB 10.6",{"type":40,"tag":137,"props":929,"children":930},{},[931,942,947],{"type":40,"tag":159,"props":932,"children":933},{},[934,940],{"type":40,"tag":178,"props":935,"children":937},{"className":936},[],[938],{"type":46,"value":939},"IS JSON",{"type":46,"value":941}," predicate",{"type":40,"tag":159,"props":943,"children":944},{},[945],{"type":46,"value":946},"Not available",{"type":40,"tag":159,"props":948,"children":949},{},[950],{"type":46,"value":951},"Available from MariaDB 12.3",{"type":40,"tag":137,"props":953,"children":954},{},[955,960,965],{"type":40,"tag":159,"props":956,"children":957},{},[958],{"type":46,"value":959},"JSON comparison",{"type":40,"tag":159,"props":961,"children":962},{},[963],{"type":46,"value":964},"Semantic (compares values)",{"type":40,"tag":159,"props":966,"children":967},{},[968],{"type":46,"value":969},"String comparison",{"type":40,"tag":137,"props":971,"children":972},{},[973,982,986],{"type":40,"tag":159,"props":974,"children":975},{},[976],{"type":40,"tag":178,"props":977,"children":979},{"className":978},[],[980],{"type":46,"value":981},"JSON_QUERY()",{"type":40,"tag":159,"props":983,"children":984},{},[985],{"type":46,"value":946},{"type":40,"tag":159,"props":987,"children":988},{},[989,991],{"type":46,"value":990},"MariaDB alternative to ",{"type":40,"tag":178,"props":992,"children":994},{"className":993},[],[995],{"type":46,"value":996},"JSON_VALUE",{"type":40,"tag":137,"props":998,"children":999},{},[1000,1005,1010],{"type":40,"tag":159,"props":1001,"children":1002},{},[1003],{"type":46,"value":1004},"JSON nesting depth limit",{"type":40,"tag":159,"props":1006,"children":1007},{},[1008],{"type":46,"value":1009},"None",{"type":40,"tag":159,"props":1011,"children":1012},{},[1013],{"type":46,"value":1014},"32 in older MariaDB; removed in 12.2+",{"type":40,"tag":137,"props":1016,"children":1017},{},[1018,1034,1039],{"type":40,"tag":159,"props":1019,"children":1020},{},[1021,1027,1028],{"type":40,"tag":178,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":46,"value":1026},"JSON_EQUALS()",{"type":46,"value":458},{"type":40,"tag":178,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":46,"value":1033},"JSON_NORMALIZE()",{"type":40,"tag":159,"props":1035,"children":1036},{},[1037],{"type":46,"value":1038},"Supported (8.0.22+)",{"type":40,"tag":159,"props":1040,"children":1041},{},[1042],{"type":46,"value":1043},"MariaDB 10.7+ (MDEV-23143 \u002F MDEV-16375)",{"type":40,"tag":137,"props":1045,"children":1046},{},[1047,1056,1061],{"type":40,"tag":159,"props":1048,"children":1049},{},[1050],{"type":40,"tag":178,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":46,"value":1055},"JSON_OVERLAPS()",{"type":40,"tag":159,"props":1057,"children":1058},{},[1059],{"type":46,"value":1060},"Supported (8.0.17+)",{"type":40,"tag":159,"props":1062,"children":1063},{},[1064],{"type":46,"value":1065},"MariaDB 10.9+ (MDEV-27677)",{"type":40,"tag":137,"props":1067,"children":1068},{},[1069,1104,1109],{"type":40,"tag":159,"props":1070,"children":1071},{},[1072,1074,1080,1082,1088,1090,1096,1097,1103],{"type":46,"value":1073},"Negative \u002F ",{"type":40,"tag":178,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":46,"value":1079},"last",{"type":46,"value":1081}," \u002F range JSON path indices (",{"type":40,"tag":178,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":46,"value":1087},"$.A[-1]",{"type":46,"value":1089},", ",{"type":40,"tag":178,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":46,"value":1095},"$.A[last]",{"type":46,"value":1089},{"type":40,"tag":178,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":46,"value":1102},"$.A[1 to 3]",{"type":46,"value":554},{"type":40,"tag":159,"props":1105,"children":1106},{},[1107],{"type":46,"value":1108},"Not supported",{"type":40,"tag":159,"props":1110,"children":1111},{},[1112],{"type":46,"value":1113},"MariaDB 10.9+",{"type":40,"tag":137,"props":1115,"children":1116},{},[1117,1126,1130],{"type":40,"tag":159,"props":1118,"children":1119},{},[1120],{"type":40,"tag":178,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":46,"value":1125},"JSON_SCHEMA_VALID()",{"type":40,"tag":159,"props":1127,"children":1128},{},[1129],{"type":46,"value":1060},{"type":40,"tag":159,"props":1131,"children":1132},{},[1133],{"type":46,"value":1134},"MariaDB 11.4 LTS+",{"type":40,"tag":49,"props":1136,"children":1137},{},[1138,1140,1146,1147,1153,1154,1160,1161,1167,1169,1174],{"type":46,"value":1139},"MariaDB closed most of the JSON function gap with MySQL 8.0 between 10.7 and 11.4. MariaDB-specific additions that MySQL still lacks: ",{"type":40,"tag":178,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":46,"value":1145},"JSON_KEY_VALUE()",{"type":46,"value":1089},{"type":40,"tag":178,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":46,"value":1152},"JSON_ARRAY_INTERSECT()",{"type":46,"value":1089},{"type":40,"tag":178,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":46,"value":1159},"JSON_OBJECT_TO_ARRAY()",{"type":46,"value":1089},{"type":40,"tag":178,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":46,"value":1166},"JSON_OBJECT_FILTER_KEYS()",{"type":46,"value":1168}," (11.4+), and the ",{"type":40,"tag":178,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":46,"value":981},{"type":46,"value":1175}," alias.",{"type":40,"tag":49,"props":1177,"children":1178},{},[1179,1181,1186,1188,1193,1195,1201],{"type":46,"value":1180},"MariaDB's JSON is fully standards-compliant, but MySQL-specific storage layout, the ",{"type":40,"tag":178,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":46,"value":241},{"type":46,"value":1187},"\u002F",{"type":40,"tag":178,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":46,"value":249},{"type":46,"value":1194}," shorthand operators, and the ",{"type":40,"tag":178,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":46,"value":1200},"JSON_SCHEMA_VALIDATION_REPORT()",{"type":46,"value":1202}," function do not transfer.",{"type":40,"tag":59,"props":1204,"children":1206},{"id":1205},"features-mariadb-has-that-mysql-doesnt",[1207],{"type":46,"value":1208},"Features MariaDB Has That MySQL Doesn't",{"type":40,"tag":49,"props":1210,"children":1211},{},[1212],{"type":46,"value":1213},"These exist in MariaDB but not MySQL — LLMs won't suggest them because they assume MySQL behavior:",{"type":40,"tag":740,"props":1215,"children":1216},{},[1217,1276,1320,1393,1416,1432,1442,1482,1559,1594],{"type":40,"tag":744,"props":1218,"children":1219},{},[1220,1228,1230,1236,1237,1243,1245,1251,1253],{"type":40,"tag":83,"props":1221,"children":1222},{},[1223],{"type":40,"tag":178,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":46,"value":399},{"type":46,"value":1229}," — get rows back from ",{"type":40,"tag":178,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":46,"value":1235},"INSERT",{"type":46,"value":113},{"type":40,"tag":178,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":46,"value":1242},"DELETE",{"type":46,"value":1244}," without a second query (10.5+); ",{"type":40,"tag":178,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":46,"value":1250},"UPDATE ... RETURNING",{"type":46,"value":1252}," available from 13.0:\n",{"type":40,"tag":815,"props":1254,"children":1256},{"className":817,"code":1255,"language":819,"meta":820,"style":820},"INSERT INTO orders (product, qty) VALUES ('widget', 5) RETURNING id, created_at;\nDELETE FROM queue WHERE processed = 1 RETURNING id;\n",[1257],{"type":40,"tag":178,"props":1258,"children":1259},{"__ignoreMap":820},[1260,1268],{"type":40,"tag":826,"props":1261,"children":1262},{"class":828,"line":829},[1263],{"type":40,"tag":826,"props":1264,"children":1265},{},[1266],{"type":46,"value":1267},"INSERT INTO orders (product, qty) VALUES ('widget', 5) RETURNING id, created_at;\n",{"type":40,"tag":826,"props":1269,"children":1270},{"class":828,"line":27},[1271],{"type":40,"tag":826,"props":1272,"children":1273},{},[1274],{"type":46,"value":1275},"DELETE FROM queue WHERE processed = 1 RETURNING id;\n",{"type":40,"tag":744,"props":1277,"children":1278},{},[1279,1287,1289,1295,1297],{"type":40,"tag":83,"props":1280,"children":1281},{},[1282],{"type":40,"tag":178,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":46,"value":426},{"type":46,"value":1288}," (10.3+) — first-class sequence objects, more flexible than ",{"type":40,"tag":178,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":46,"value":1294},"AUTO_INCREMENT",{"type":46,"value":1296},":\n",{"type":40,"tag":815,"props":1298,"children":1300},{"className":817,"code":1299,"language":819,"meta":820,"style":820},"CREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1;\nSELECT NEXT VALUE FOR order_seq;\n",[1301],{"type":40,"tag":178,"props":1302,"children":1303},{"__ignoreMap":820},[1304,1312],{"type":40,"tag":826,"props":1305,"children":1306},{"class":828,"line":829},[1307],{"type":40,"tag":826,"props":1308,"children":1309},{},[1310],{"type":46,"value":1311},"CREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1;\n",{"type":40,"tag":826,"props":1313,"children":1314},{"class":828,"line":27},[1315],{"type":40,"tag":826,"props":1316,"children":1317},{},[1318],{"type":46,"value":1319},"SELECT NEXT VALUE FOR order_seq;\n",{"type":40,"tag":744,"props":1321,"children":1322},{},[1323,1332,1334],{"type":40,"tag":83,"props":1324,"children":1325},{},[1326],{"type":40,"tag":178,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":46,"value":1331},"WITH SYSTEM VERSIONING",{"type":46,"value":1333}," (10.3+) — temporal tables that automatically track row history:\n",{"type":40,"tag":815,"props":1335,"children":1337},{"className":817,"code":1336,"language":819,"meta":820,"style":820},"CREATE TABLE prices (\n    item VARCHAR(100),\n    price DECIMAL(10,2)\n) WITH SYSTEM VERSIONING;\n-- Query historical data:\nSELECT * FROM prices FOR SYSTEM_TIME AS OF '2025-01-01';\n",[1338],{"type":40,"tag":178,"props":1339,"children":1340},{"__ignoreMap":820},[1341,1349,1357,1366,1375,1384],{"type":40,"tag":826,"props":1342,"children":1343},{"class":828,"line":829},[1344],{"type":40,"tag":826,"props":1345,"children":1346},{},[1347],{"type":46,"value":1348},"CREATE TABLE prices (\n",{"type":40,"tag":826,"props":1350,"children":1351},{"class":828,"line":27},[1352],{"type":40,"tag":826,"props":1353,"children":1354},{},[1355],{"type":46,"value":1356},"    item VARCHAR(100),\n",{"type":40,"tag":826,"props":1358,"children":1360},{"class":828,"line":1359},3,[1361],{"type":40,"tag":826,"props":1362,"children":1363},{},[1364],{"type":46,"value":1365},"    price DECIMAL(10,2)\n",{"type":40,"tag":826,"props":1367,"children":1369},{"class":828,"line":1368},4,[1370],{"type":40,"tag":826,"props":1371,"children":1372},{},[1373],{"type":46,"value":1374},") WITH SYSTEM VERSIONING;\n",{"type":40,"tag":826,"props":1376,"children":1378},{"class":828,"line":1377},5,[1379],{"type":40,"tag":826,"props":1380,"children":1381},{},[1382],{"type":46,"value":1383},"-- Query historical data:\n",{"type":40,"tag":826,"props":1385,"children":1387},{"class":828,"line":1386},6,[1388],{"type":40,"tag":826,"props":1389,"children":1390},{},[1391],{"type":46,"value":1392},"SELECT * FROM prices FOR SYSTEM_TIME AS OF '2025-01-01';\n",{"type":40,"tag":744,"props":1394,"children":1395},{},[1396,1407,1409,1414],{"type":40,"tag":83,"props":1397,"children":1398},{},[1399,1405],{"type":40,"tag":178,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":46,"value":1404},"LIMIT",{"type":46,"value":1406}," in subqueries",{"type":46,"value":1408}," — MariaDB supports ",{"type":40,"tag":178,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":46,"value":1404},{"type":46,"value":1415}," inside subqueries; MySQL restricts this",{"type":40,"tag":744,"props":1417,"children":1418},{},[1419,1430],{"type":40,"tag":83,"props":1420,"children":1421},{},[1422,1424],{"type":46,"value":1423},"Atomic ",{"type":40,"tag":178,"props":1425,"children":1427},{"className":1426},[],[1428],{"type":46,"value":1429},"CREATE OR REPLACE TABLE",{"type":46,"value":1431}," (13.0+) — the statement is fully atomic in MariaDB; MySQL has no atomic equivalent",{"type":40,"tag":744,"props":1433,"children":1434},{},[1435,1440],{"type":40,"tag":83,"props":1436,"children":1437},{},[1438],{"type":46,"value":1439},"Galera Cluster",{"type":46,"value":1441}," — built-in multi-master clustering, no plugin required",{"type":40,"tag":744,"props":1443,"children":1444},{},[1445,1450,1452,1458,1459,1465,1467,1473,1475],{"type":40,"tag":83,"props":1446,"children":1447},{},[1448],{"type":46,"value":1449},"Stored procedure syntax differences",{"type":46,"value":1451}," — both support stored procedures, but MariaDB's SQL\u002FPSM syntax differs from MySQL in ",{"type":40,"tag":178,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":46,"value":1457},"HANDLER",{"type":46,"value":1089},{"type":40,"tag":178,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":46,"value":1464},"CURSOR",{"type":46,"value":1466},", and ",{"type":40,"tag":178,"props":1468,"children":1470},{"className":1469},[],[1471],{"type":46,"value":1472},"CONDITION",{"type":46,"value":1474}," declarations; AI agents frequently generate incorrect MariaDB stored procedure code — see ",{"type":40,"tag":647,"props":1476,"children":1479},{"href":1477,"rel":1478},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-usage\u002Fstored-routines\u002Fstored-procedures",[651],[1480],{"type":46,"value":1481},"Stored Procedures — MariaDB Docs",{"type":40,"tag":744,"props":1483,"children":1484},{},[1485,1490,1492,1503,1505,1516,1518,1529,1531,1537,1538,1544,1546,1557],{"type":40,"tag":83,"props":1486,"children":1487},{},[1488],{"type":46,"value":1489},"Native data types MySQL 8.0 lacks",{"type":46,"value":1491}," — ",{"type":40,"tag":647,"props":1493,"children":1496},{"href":1494,"rel":1495},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Finet6",[651],[1497],{"type":40,"tag":178,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":46,"value":1502},"INET6",{"type":46,"value":1504}," (10.5+) and ",{"type":40,"tag":647,"props":1506,"children":1509},{"href":1507,"rel":1508},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Finet4",[651],[1510],{"type":40,"tag":178,"props":1511,"children":1513},{"className":1512},[],[1514],{"type":46,"value":1515},"INET4",{"type":46,"value":1517}," (10.10+) for IP address storage and comparison; ",{"type":40,"tag":647,"props":1519,"children":1522},{"href":1520,"rel":1521},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Fuuid-data-type",[651],[1523],{"type":40,"tag":178,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":46,"value":1528},"UUID",{"type":46,"value":1530}," (10.7+; MySQL stores UUIDs in ",{"type":40,"tag":178,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":46,"value":1536},"BINARY(16)",{"type":46,"value":113},{"type":40,"tag":178,"props":1539,"children":1541},{"className":1540},[],[1542],{"type":46,"value":1543},"CHAR(36)",{"type":46,"value":1545},"); ",{"type":40,"tag":647,"props":1547,"children":1550},{"href":1548,"rel":1549},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Fvectors\u002Fvector",[651],[1551],{"type":40,"tag":178,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":46,"value":1556},"VECTOR",{"type":46,"value":1558}," for embeddings and similarity search (11.7+; MySQL added a vector type only in its 9.x innovation series, not in 8.0)",{"type":40,"tag":744,"props":1560,"children":1561},{},[1562,1578,1580,1585,1587,1592],{"type":40,"tag":83,"props":1563,"children":1564},{},[1565,1570,1571,1576],{"type":40,"tag":178,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":46,"value":383},{"type":46,"value":243},{"type":40,"tag":178,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":46,"value":375},{"type":46,"value":1577}," functions",{"type":46,"value":1579}," (11.7+) — MariaDB-specific; MySQL only has the original ",{"type":40,"tag":178,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":46,"value":362},{"type":46,"value":1586},". ",{"type":40,"tag":178,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":46,"value":375},{"type":46,"value":1593}," is time-ordered (RFC 9562) and is the right choice for UUID primary keys",{"type":40,"tag":744,"props":1595,"children":1596},{},[1597,1606],{"type":40,"tag":83,"props":1598,"children":1599},{},[1600],{"type":40,"tag":178,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":46,"value":1605},"FORMAT_BYTES()",{"type":46,"value":1607}," (11.8+) — convert byte counts to human-readable strings; not in MySQL",{"type":40,"tag":59,"props":1609,"children":1611},{"id":1610},"features-mysql-has-that-mariadb-doesnt",[1612],{"type":46,"value":1613},"Features MySQL Has That MariaDB Doesn't",{"type":40,"tag":49,"props":1615,"children":1616},{},[1617],{"type":46,"value":1618},"These exist in MySQL 8.0 but not in MariaDB — code using them needs adaptation:",{"type":40,"tag":740,"props":1620,"children":1621},{},[1622,1635,1651,1724,1750,1783],{"type":40,"tag":744,"props":1623,"children":1624},{},[1625,1633],{"type":40,"tag":83,"props":1626,"children":1627},{},[1628],{"type":40,"tag":178,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":46,"value":220},{"type":46,"value":1634}," — available since MariaDB 10.6; on older versions rewrite using MariaDB JSON functions or application-level parsing",{"type":40,"tag":744,"props":1636,"children":1637},{},[1638,1649],{"type":40,"tag":83,"props":1639,"children":1640},{},[1641,1647],{"type":40,"tag":178,"props":1642,"children":1644},{"className":1643},[],[1645],{"type":46,"value":1646},"sys",{"type":46,"value":1648}," schema",{"type":46,"value":1650}," — available since MariaDB 10.6; not available in older versions",{"type":40,"tag":744,"props":1652,"children":1653},{},[1654,1659,1660,1666,1667,1673,1674,1680,1681,1687,1688,1694,1695,1701,1702,1708,1709,1715,1716,1722],{"type":40,"tag":83,"props":1655,"children":1656},{},[1657],{"type":46,"value":1658},"MySQL 8 GIS functions",{"type":46,"value":567},{"type":40,"tag":178,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":46,"value":1665},"ST_Validate",{"type":46,"value":1089},{"type":40,"tag":178,"props":1668,"children":1670},{"className":1669},[],[1671],{"type":46,"value":1672},"MBRCoveredBy",{"type":46,"value":1089},{"type":40,"tag":178,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":46,"value":1679},"ST_Simplify",{"type":46,"value":1089},{"type":40,"tag":178,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":46,"value":1686},"ST_GeoHash",{"type":46,"value":1089},{"type":40,"tag":178,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":46,"value":1693},"ST_LatFromGeoHash",{"type":46,"value":1089},{"type":40,"tag":178,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":46,"value":1700},"ST_LongFromGeoHash",{"type":46,"value":1089},{"type":40,"tag":178,"props":1703,"children":1705},{"className":1704},[],[1706],{"type":46,"value":1707},"ST_PointFromGeoHash",{"type":46,"value":1089},{"type":40,"tag":178,"props":1710,"children":1712},{"className":1711},[],[1713],{"type":46,"value":1714},"ST_IsValid",{"type":46,"value":1089},{"type":40,"tag":178,"props":1717,"children":1719},{"className":1718},[],[1720],{"type":46,"value":1721},"ST_Collect",{"type":46,"value":1723},") — added in MariaDB 12.0 for MySQL compatibility",{"type":40,"tag":744,"props":1725,"children":1726},{},[1727,1737,1739,1744,1745],{"type":40,"tag":83,"props":1728,"children":1729},{},[1730,1735],{"type":40,"tag":178,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":46,"value":183},{"type":46,"value":1736}," as default plugin",{"type":46,"value":1738}," — available as an opt-in plugin from MariaDB 12.1; on older or stock setups, use ",{"type":40,"tag":178,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":46,"value":201},{"type":46,"value":113},{"type":40,"tag":178,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":46,"value":208},{"type":40,"tag":744,"props":1751,"children":1752},{},[1753,1770,1771,1776,1777,1782],{"type":40,"tag":83,"props":1754,"children":1755},{},[1756,1757,1762,1763,1768],{"type":46,"value":235},{"type":40,"tag":178,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":46,"value":241},{"type":46,"value":243},{"type":40,"tag":178,"props":1764,"children":1766},{"className":1765},[],[1767],{"type":46,"value":249},{"type":46,"value":1769}," operators",{"type":46,"value":478},{"type":40,"tag":178,"props":1772,"children":1774},{"className":1773},[],[1775],{"type":46,"value":262},{"type":46,"value":243},{"type":40,"tag":178,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":46,"value":269},{"type":46,"value":271},{"type":40,"tag":744,"props":1784,"children":1785},{},[1786,1796,1798,1803,1805,1810],{"type":40,"tag":83,"props":1787,"children":1788},{},[1789,1794],{"type":40,"tag":178,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":46,"value":283},{"type":46,"value":1795}," collation",{"type":46,"value":1797}," — supported since MariaDB 11.4.5 (alias for ",{"type":40,"tag":178,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":46,"value":296},{"type":46,"value":1804},"); on older versions replace with ",{"type":40,"tag":178,"props":1806,"children":1808},{"className":1807},[],[1809],{"type":46,"value":304},{"type":46,"value":1811}," before importing",{"type":40,"tag":59,"props":1813,"children":1815},{"id":1814},"data-dictionary-architecture",[1816],{"type":46,"value":720},{"type":40,"tag":49,"props":1818,"children":1819},{},[1820],{"type":46,"value":1821},"MySQL 8.0 and MariaDB store table metadata in fundamentally different ways, and this affects how you migrate:",{"type":40,"tag":740,"props":1823,"children":1824},{},[1825,1866],{"type":40,"tag":744,"props":1826,"children":1827},{},[1828,1833,1835,1842,1844,1850,1852,1865],{"type":40,"tag":83,"props":1829,"children":1830},{},[1831],{"type":46,"value":1832},"MySQL 8.0",{"type":46,"value":1834}," keeps all object metadata in a ",{"type":40,"tag":647,"props":1836,"children":1839},{"href":1837,"rel":1838},"https:\u002F\u002Fdev.mysql.com\u002Fdoc\u002Frefman\u002F8.0\u002Fen\u002Fdata-dictionary.html",[651],[1840],{"type":46,"value":1841},"transactional data dictionary",{"type":46,"value":1843}," stored in InnoDB (",{"type":40,"tag":178,"props":1845,"children":1847},{"className":1846},[],[1848],{"type":46,"value":1849},"mysql.ibd",{"type":46,"value":1851},"), and ",{"type":40,"tag":83,"props":1853,"children":1854},{},[1855,1857,1863],{"type":46,"value":1856},"removed the per-table ",{"type":40,"tag":178,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":46,"value":1862},".frm",{"type":46,"value":1864}," files",{"type":46,"value":796},{"type":40,"tag":744,"props":1867,"children":1868},{},[1869,1873,1875,1880],{"type":40,"tag":83,"props":1870,"children":1871},{},[1872],{"type":46,"value":9},{"type":46,"value":1874}," keeps the file-based approach — a ",{"type":40,"tag":178,"props":1876,"children":1878},{"className":1877},[],[1879],{"type":46,"value":1862},{"type":46,"value":1881}," file per table plus storage-engine metadata — and has no transactional data dictionary. (MariaDB grant tables use the Aria engine; MySQL 8.0 holds system tables in the InnoDB dictionary.)",{"type":40,"tag":49,"props":1883,"children":1884},{},[1885],{"type":46,"value":1886},"Practical consequences:",{"type":40,"tag":740,"props":1888,"children":1889},{},[1890,1940,1950],{"type":40,"tag":744,"props":1891,"children":1892},{},[1893,1898,1900,1905,1907,1914,1916,1922,1924,1930,1932,1938],{"type":40,"tag":83,"props":1894,"children":1895},{},[1896],{"type":46,"value":1897},"Do not migrate by copying data files.",{"type":46,"value":1899}," InnoDB tablespaces and datadir files are ",{"type":40,"tag":83,"props":1901,"children":1902},{},[1903],{"type":46,"value":1904},"not",{"type":46,"value":1906}," portable between MySQL 8.0 and MariaDB — the dictionary formats are incompatible. Use a logical dump\u002Frestore instead. MariaDB's ",{"type":40,"tag":647,"props":1908,"children":1911},{"href":1909,"rel":1910},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-management\u002Finstall-and-upgrade-mariadb\u002Fmigrating-to-mariadb\u002Fmoving-from-mysql\u002Fmysql-to-mariadb-migration-the-master-guide",[651],[1912],{"type":46,"value":1913},"migration guide",{"type":46,"value":1915}," recommends MySQL's own ",{"type":40,"tag":178,"props":1917,"children":1919},{"className":1918},[],[1920],{"type":46,"value":1921},"mysqldump",{"type":46,"value":1923}," for this direction (not ",{"type":40,"tag":178,"props":1925,"children":1927},{"className":1926},[],[1928],{"type":46,"value":1929},"mariadb-dump",{"type":46,"value":1931},", which isn't well tested against MySQL), dumping named databases rather than ",{"type":40,"tag":178,"props":1933,"children":1935},{"className":1934},[],[1936],{"type":46,"value":1937},"--all-databases",{"type":46,"value":1939}," so MySQL's system tables aren't imported.",{"type":40,"tag":744,"props":1941,"children":1942},{},[1943,1948],{"type":40,"tag":83,"props":1944,"children":1945},{},[1946],{"type":46,"value":1947},"No in-place downgrade",{"type":46,"value":1949}," from MySQL 8.0 to MariaDB — MariaDB cannot read MySQL's data dictionary; a logical export\u002Fimport is required.",{"type":40,"tag":744,"props":1951,"children":1952},{},[1953,1964],{"type":40,"tag":83,"props":1954,"children":1955},{},[1956,1962],{"type":40,"tag":178,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":46,"value":1961},"INFORMATION_SCHEMA",{"type":46,"value":1963}," is implemented differently",{"type":46,"value":1965}," — MySQL 8.0 queries indexed dictionary tables, while MariaDB builds I_S views dynamically; metadata-heavy queries against I_S can have different performance characteristics, so don't assume MySQL 8.0 timings carry over.",{"type":40,"tag":59,"props":1967,"children":1969},{"id":1968},"optimizer-differences",[1970],{"type":46,"value":1971},"Optimizer Differences",{"type":40,"tag":49,"props":1973,"children":1974},{},[1975],{"type":46,"value":1976},"MariaDB and MySQL use different query optimizers with different cost models. Identical SQL can produce different execution plans. After migration:",{"type":40,"tag":740,"props":1978,"children":1979},{},[1980,1993,1998],{"type":40,"tag":744,"props":1981,"children":1982},{},[1983,1985,1991],{"type":46,"value":1984},"Re-run ",{"type":40,"tag":178,"props":1986,"children":1988},{"className":1987},[],[1989],{"type":46,"value":1990},"EXPLAIN",{"type":46,"value":1992}," on critical queries — do not assume execution plans transfer",{"type":40,"tag":744,"props":1994,"children":1995},{},[1996],{"type":46,"value":1997},"Index hints that work in MySQL may not be needed (or may differ) in MariaDB",{"type":40,"tag":744,"props":1999,"children":2000},{},[2001,2003],{"type":46,"value":2002},"MariaDB's optimizer is more aggressively tunable via ",{"type":40,"tag":178,"props":2004,"children":2006},{"className":2005},[],[2007],{"type":46,"value":2008},"optimizer_switch",{"type":40,"tag":59,"props":2010,"children":2012},{"id":2011},"version-compatibility-quick-reference",[2013],{"type":46,"value":2014},"Version Compatibility Quick Reference",{"type":40,"tag":129,"props":2016,"children":2017},{},[2018,2039],{"type":40,"tag":133,"props":2019,"children":2020},{},[2021],{"type":40,"tag":137,"props":2022,"children":2023},{},[2024,2029,2034],{"type":40,"tag":141,"props":2025,"children":2026},{},[2027],{"type":46,"value":2028},"MySQL version",{"type":40,"tag":141,"props":2030,"children":2031},{},[2032],{"type":46,"value":2033},"MariaDB equivalent",{"type":40,"tag":141,"props":2035,"children":2036},{},[2037],{"type":46,"value":2038},"Drop-in?",{"type":40,"tag":152,"props":2040,"children":2041},{},[2042,2059,2077,2095],{"type":40,"tag":137,"props":2043,"children":2044},{},[2045,2050,2054],{"type":40,"tag":159,"props":2046,"children":2047},{},[2048],{"type":46,"value":2049},"5.5",{"type":40,"tag":159,"props":2051,"children":2052},{},[2053],{"type":46,"value":2049},{"type":40,"tag":159,"props":2055,"children":2056},{},[2057],{"type":46,"value":2058},"Yes",{"type":40,"tag":137,"props":2060,"children":2061},{},[2062,2067,2072],{"type":40,"tag":159,"props":2063,"children":2064},{},[2065],{"type":46,"value":2066},"5.6",{"type":40,"tag":159,"props":2068,"children":2069},{},[2070],{"type":46,"value":2071},"10.0–10.1",{"type":40,"tag":159,"props":2073,"children":2074},{},[2075],{"type":46,"value":2076},"Mostly",{"type":40,"tag":137,"props":2078,"children":2079},{},[2080,2085,2090],{"type":40,"tag":159,"props":2081,"children":2082},{},[2083],{"type":46,"value":2084},"5.7",{"type":40,"tag":159,"props":2086,"children":2087},{},[2088],{"type":46,"value":2089},"10.2–10.4",{"type":40,"tag":159,"props":2091,"children":2092},{},[2093],{"type":46,"value":2094},"Limited",{"type":40,"tag":137,"props":2096,"children":2097},{},[2098,2103,2108],{"type":40,"tag":159,"props":2099,"children":2100},{},[2101],{"type":46,"value":2102},"8.0",{"type":40,"tag":159,"props":2104,"children":2105},{},[2106],{"type":46,"value":2107},"10.5+",{"type":40,"tag":159,"props":2109,"children":2110},{},[2111],{"type":46,"value":2112},"No — significant differences",{"type":40,"tag":59,"props":2114,"children":2116},{"id":2115},"sources",[2117],{"type":46,"value":2118},"Sources",{"type":40,"tag":740,"props":2120,"children":2121},{},[2122,2132,2142,2154,2164,2174,2184],{"type":40,"tag":744,"props":2123,"children":2124},{},[2125],{"type":40,"tag":647,"props":2126,"children":2129},{"href":2127,"rel":2128},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Frelease-notes\u002Fcommunity-server\u002Fabout\u002Fcompatibility-and-differences\u002Fmariadb-vs-mysql-compatibility",[651],[2130],{"type":46,"value":2131},"MariaDB vs MySQL Compatibility — MariaDB Docs",{"type":40,"tag":744,"props":2133,"children":2134},{},[2135],{"type":40,"tag":647,"props":2136,"children":2139},{"href":2137,"rel":2138},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-management\u002Finstall-and-upgrade-mariadb\u002Fmigrating-to-mariadb\u002Fmoving-from-mysql\u002F",[651],[2140],{"type":46,"value":2141},"Moving from MySQL to MariaDB — MariaDB Docs",{"type":40,"tag":744,"props":2143,"children":2144},{},[2145,2152],{"type":40,"tag":647,"props":2146,"children":2149},{"href":2147,"rel":2148},"https:\u002F\u002Fjira.mariadb.org\u002Fbrowse\u002FMDEV-28906",[651],[2150],{"type":46,"value":2151},"MDEV-28906 — MySQL 8.0 desired compatibility (Jira epic)",{"type":46,"value":2153}," — tracks MySQL 8.0 compatibility work; check individual sub-task status before assuming an item is still missing — closed sub-tasks mean the feature has been implemented",{"type":40,"tag":744,"props":2155,"children":2156},{},[2157],{"type":40,"tag":647,"props":2158,"children":2161},{"href":2159,"rel":2160},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-statements\u002Fdata-manipulation\u002Finserting-loading-data\u002Finsertreturning",[651],[2162],{"type":46,"value":2163},"RETURNING — MariaDB Docs",{"type":40,"tag":744,"props":2165,"children":2166},{},[2167],{"type":40,"tag":647,"props":2168,"children":2171},{"href":2169,"rel":2170},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Fsequences\u002Fcreate-sequence",[651],[2172],{"type":46,"value":2173},"CREATE SEQUENCE — MariaDB Docs",{"type":40,"tag":744,"props":2175,"children":2176},{},[2177],{"type":40,"tag":647,"props":2178,"children":2181},{"href":2179,"rel":2180},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Ftemporal-tables\u002Fsystem-versioned-tables",[651],[2182],{"type":46,"value":2183},"System-Versioned Tables — MariaDB Docs",{"type":40,"tag":744,"props":2185,"children":2186},{},[2187],{"type":40,"tag":647,"props":2188,"children":2191},{"href":2189,"rel":2190},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fplugins\u002Fauthentication-plugins",[651],[2192],{"type":46,"value":2193},"Authentication Plugins — MariaDB Docs",{"type":40,"tag":49,"props":2195,"children":2196},{},[2197],{"type":40,"tag":53,"props":2198,"children":2199},{},[2200,2202,2207],{"type":46,"value":2201},"For topics not covered here, see the official MariaDB documentation at ",{"type":40,"tag":647,"props":2203,"children":2205},{"href":676,"rel":2204},[651],[2206],{"type":46,"value":680},{"type":46,"value":796},{"type":40,"tag":2209,"props":2210,"children":2211},"style",{},[2212],{"type":46,"value":2213},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2215,"total":2310},[2216,2230,2242,2253,2265,2283,2293,2300],{"slug":2217,"name":2217,"fn":2218,"description":2219,"org":2220,"tags":2221,"stars":23,"repoUrl":24,"updatedAt":2229},"mariadb-features","optimize and manage MariaDB databases","MariaDB-specific features and capabilities that go beyond standard MySQL. Use when evaluating MariaDB, optimizing an existing MariaDB application, reviewing code or schema for MariaDB improvements, asking what MariaDB can do that other databases cannot, or migrating from Oracle to MariaDB. Also use when the user asks what could be improved in how a codebase uses MariaDB, or asks about MariaDB advantages over MySQL or PostgreSQL.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2222,2223,2224,2227],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2225,"slug":2226,"type":15},"Performance","performance",{"name":2228,"slug":819,"type":15},"SQL","2026-07-16T06:01:55.988338",{"slug":2231,"name":2231,"fn":2232,"description":2233,"org":2234,"tags":2235,"stars":23,"repoUrl":24,"updatedAt":2241},"mariadb-mcp","connect AI agents to MariaDB","How to connect AI agents to MariaDB using the Model Context Protocol (MCP). Use when setting up MCP with MariaDB, connecting Claude Code, Cursor, or other AI tools to a MariaDB database, enabling natural language database queries, or building AI applications that need live database access. The MariaDB MCP Server lets agents query schemas, run read-only SQL, and perform semantic search against MariaDB.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2236,2237,2238],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2239,"slug":2240,"type":15},"MCP","mcp","2026-07-13T06:14:00.682655",{"slug":2243,"name":2243,"fn":2244,"description":2245,"org":2246,"tags":2247,"stars":23,"repoUrl":24,"updatedAt":2252},"mariadb-query-optimization","optimize MariaDB database queries","Best practices for query optimization in MariaDB — indexing strategies, EXPLAIN analysis, pagination, histogram statistics, and MariaDB-specific optimizer settings. Use when diagnosing slow queries, designing indexes, reviewing schema or query performance, or when queries involve large tables, pagination, GROUP BY, or ORDER BY. Also use when the user asks about MariaDB query performance, EXPLAIN output, or optimizer behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2248,2249,2250,2251],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2225,"slug":2226,"type":15},{"name":2228,"slug":819,"type":15},"2026-07-13T06:14:12.656074",{"slug":2254,"name":2254,"fn":2255,"description":2256,"org":2257,"tags":2258,"stars":23,"repoUrl":24,"updatedAt":2264},"mariadb-replication-and-ha","configure MariaDB replication and high availability","Best practices for MariaDB replication and high availability — Galera Cluster, GTID replication, semi-synchronous replication, parallel replication, and application patterns for HA environments. Use when setting up replication, designing applications for HA, working with Galera Cluster, asking about MariaDB GTID, handling replication lag in application code, or choosing between replication topologies. IMPORTANT — MariaDB GTID format is incompatible with MySQL GTID, and Galera Cluster needs no server plugin to load but does require the separate galera wsrep provider library (galera-4).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2259,2262,2263],{"name":2260,"slug":2261,"type":15},"Architecture","architecture",{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},"2026-07-13T06:14:13.989369",{"slug":2266,"name":2266,"fn":2267,"description":2268,"org":2269,"tags":2270,"stars":23,"repoUrl":24,"updatedAt":2282},"mariadb-system-versioned-tables","implement MariaDB system-versioned tables","Best practices for MariaDB system-versioned (temporal) tables — automatic row history built into the database. Use when tracking data changes over time, implementing audit trails, meeting GDPR or compliance requirements, doing point-in-time queries, or when the user asks about row history, data versioning, temporal tables, or querying past data states in MariaDB. This feature is unique to MariaDB among MySQL-compatible databases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2271,2274,2277,2278,2281],{"name":2272,"slug":2273,"type":15},"Audit","audit",{"name":2275,"slug":2276,"type":15},"Compliance","compliance",{"name":18,"slug":19,"type":15},{"name":2279,"slug":2280,"type":15},"GDPR","gdpr",{"name":9,"slug":8,"type":15},"2026-07-13T06:14:16.779878",{"slug":2284,"name":2284,"fn":2285,"description":2286,"org":2287,"tags":2288,"stars":23,"repoUrl":24,"updatedAt":2292},"mariadb-vector","build semantic search with MariaDB vectors","Best practices for using vectors and AI with MariaDB. Use when writing SQL involving VECTOR columns, building RAG or semantic search with MariaDB, choosing embedding models, designing vector indexes, or integrating MariaDB with AI frameworks like LangChain, LlamaIndex, or Spring AI. Also use when the user mentions MariaDB and any of: vectors, embeddings, similarity search, nearest neighbor, AI, RAG, or LLM. IMPORTANT — MariaDB has native built-in vector support since version 11.7; it is NOT a plugin or extension (unlike pgvector for PostgreSQL). Do not recommend installing any extension.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2289,2290,2291],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-13T06:14:01.939479",{"slug":4,"name":4,"fn":5,"description":6,"org":2294,"tags":2295,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2296,2297,2298,2299],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"slug":2301,"name":2301,"fn":2302,"description":2303,"org":2304,"tags":2305,"stars":23,"repoUrl":24,"updatedAt":2309},"oracle-to-mariadb","migrate Oracle databases to MariaDB","Compatibility guide for developers migrating from Oracle Database to MariaDB. Use when migrating Oracle schemas, PL\u002FSQL procedures, or applications to MariaDB, when Oracle syntax causes unexpected behavior in MariaDB, or when evaluating MariaDB as an Oracle replacement. MariaDB is the only open source database with native PL\u002FSQL compatibility — MariaDB's sql_mode=ORACLE enables migration of approximately 80% of Oracle code without rewrites.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2306,2307,2308],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-13T06:14:11.069809",8,{"items":2312,"total":2310},[2313,2320,2326,2333,2339,2347,2353],{"slug":2217,"name":2217,"fn":2218,"description":2219,"org":2314,"tags":2315,"stars":23,"repoUrl":24,"updatedAt":2229},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2316,2317,2318,2319],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2225,"slug":2226,"type":15},{"name":2228,"slug":819,"type":15},{"slug":2231,"name":2231,"fn":2232,"description":2233,"org":2321,"tags":2322,"stars":23,"repoUrl":24,"updatedAt":2241},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2323,2324,2325],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2239,"slug":2240,"type":15},{"slug":2243,"name":2243,"fn":2244,"description":2245,"org":2327,"tags":2328,"stars":23,"repoUrl":24,"updatedAt":2252},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2329,2330,2331,2332],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2225,"slug":2226,"type":15},{"name":2228,"slug":819,"type":15},{"slug":2254,"name":2254,"fn":2255,"description":2256,"org":2334,"tags":2335,"stars":23,"repoUrl":24,"updatedAt":2264},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2336,2337,2338],{"name":2260,"slug":2261,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":2266,"name":2266,"fn":2267,"description":2268,"org":2340,"tags":2341,"stars":23,"repoUrl":24,"updatedAt":2282},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2342,2343,2344,2345,2346],{"name":2272,"slug":2273,"type":15},{"name":2275,"slug":2276,"type":15},{"name":18,"slug":19,"type":15},{"name":2279,"slug":2280,"type":15},{"name":9,"slug":8,"type":15},{"slug":2284,"name":2284,"fn":2285,"description":2286,"org":2348,"tags":2349,"stars":23,"repoUrl":24,"updatedAt":2292},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2350,2351,2352],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":2354,"tags":2355,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2356,2357,2358,2359],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15}]