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 ) | +-------+--------------------------------------------------------------+
© 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/