Spec-Zone.ru › MariaDB

mariadb_schema

mariadb_schema — это квалификатор типа данных, позволяющий создавать собственные типы данных MariaDB в SQL_MODE с конфликтующими преобразованиями типов данных.

mariadb_schema был представлен в MariaDB 10.3.24, MariaDB 10.4.14 и MariaDB 10.5.5.

Например, в SQL_MODE=ORACLE, если создать таблицу с типом DATE, она фактически создаст столбец DATETIME для соответствия ожиданиям пользователя Oracle. Чтобы создать тип данных MariaDB DATE в режиме Oracle, нужно использовать mariadb_schema:

CREATE TABLE t1 (d mariadb_schema.DATE);

mariadb_schema также отображается, если создать таблицу с DATE в собственном режиме MariaDB и выполнить SHOW CREATE TABLE в ORACLE режиме:

SET sql_mode=DEFAULT;
CREATE OR REPLACE TABLE t1 (
  d DATE
);
SET SQL_mode=ORACLE;
SHOW CREATE TABLE t1;
+-------+--------------------------------------------------------------+
| Table | Create Table                                                 |
+-------+--------------------------------------------------------------+
| t1    | CREATE TABLE "t1" (
  "d" mariadb_schema.date DEFAULT NULL
) |
+-------+--------------------------------------------------------------+

Когда сервер видит квалификатор mariadb_schema, он отключает преобразование типа данных, специфичное для sql_mode, и интерпретирует тип данных буквально. Например, mariadb_schema.DATE интерпретируется как традиционный тип данных MariaDB DATE, независимо от текущего sql_mode.

Префикс mariadb_schema отображается только тогда, когда имя типа данных в противном случае было бы неоднозначным. Префикс отображается вместе с типом данных MariaDB DATE при выполнении SHOW CREATE TABLE в SQL_MODE=ORACLE. Префикс не отображается при выполнении SHOW CREATE TABLE в SQL_MODE=DEFAULT или при отображении недвусмысленного типа данных.

Обратите внимание, что префикс mariadb_schema может использоваться с любым типом данных, включая недвусмысленные:

CREATE OR REPLACE TABLE t1 (a mariadb_schema.INT);
SHOW CREATE TABLE t1;
+-------+--------------------------------------------------+
| Table | Create Table                                     |
+-------+--------------------------------------------------+
| t1    | CREATE TABLE "t1" (
  "a" int(11) DEFAULT NULL
) |
+-------+--------------------------------------------------+

В настоящее время префикс mariadb_schema используется только в следующих случаях:

  • Для собственного типа данных MariaDB DATE при выполнении SHOW CREATE TABLE в режиме Oracle.

История

При работе с SQL_MODE=ORACLE сервер MariaDB преобразует тип данных DATE в DATETIME, для лучшей совместимости с Oracle:

SET SQL_mode=ORACLE;
CREATE OR REPLACE TABLE t1 (
  d DATE
);
SHOW CREATE TABLE t1;
+-------+---------------------------------------------------+
| Table | Create Table                                      |
+-------+---------------------------------------------------+
| t1    | CREATE TABLE "t1" (
  "d" datetime DEFAULT NULL
) |
+-------+---------------------------------------------------+

Обратите внимание, что DATE было преобразовано в DATETIME.

Это преобразование может вызвать неоднозначность. Предположим, пользователь создает таблицу со столбцом традиционного типа данных MariaDB DATE в стандартном sql_mode, но затем переключается на SQL_MODE=ORACLE и выполняет SHOW CREATE TABLE:

SET sql_mode=DEFAULT;
CREATE OR REPLACE TABLE t1 (
  d DATE
);
SET SQL_mode=ORACLE;
SHOW CREATE TABLE t1;

До появления mariadb_schema вышеприведенный скрипт отображал:

CREATE TABLE "t1" (
  "d" date DEFAULT NULL
);

что имело две проблемы:

  • Это было запутанно для читателя: неясно, является ли это традиционным типом данных MariaDB DATE, или это тип данных Oracle (который фактически DATETIME);
  • Это нарушало репликацию и приводило к несовпадению типов данных на мастер- и на slave-серверах (см. MDEV-19632).

Для решения этой проблемы, начиная с указанных версий, MariaDB использует понятие квалифицированных типов данных:

SET sql_mode=DEFAULT;
CREATE OR REPLACE TABLE t1 (
  d DATE
);
SET SQL_mode=ORACLE;
SHOW CREATE TABLE t1;
+-------+--------------------------------------------------------------+
| Table | Create Table                                                 |
+-------+--------------------------------------------------------------+
| t1    | CREATE TABLE "t1" (
  "d" mariadb_schema.date DEFAULT NULL
) |
+-------+--------------------------------------------------------------+
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительную проверку MariaDB. Мнения, информация и мнения, выраженные в данном контенте, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/mariadb_schema/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API