El día de hoy les hablaré de las diferencias mas sobresalientes entre la base de datos Oracle vs MySQL, basándome en los siguientes cuatro enfoques:

  • Seguridad de la base de datos
  • Migración de esquema
  • Tipos de datos
  • Conceptos de almacenamiento de datos

Seguridad de la base de datos

Al igual que con Oracle, los usuarios de MySQL son mantenidos por la base de datos. MySQL utiliza un conjunto de tablas de concesión para realizar un seguimiento de los usuarios y los privilegios que pueden tener. MySQL utiliza estas tablas de concesión al realizar la autenticación, autorización y control de acceso para los usuarios.

Autenticación de base de datos

A diferencia de Oracle (cuando se configura para usar la autenticación de base de datos) y la mayoría de otras bases de datos que usan sólo el nombre de usuario y la contraseña para autenticar un usuario, MySQL utiliza un parámetro de ubicación adicional al autenticar un usuario. Este parámetro de ubicación suele ser el nombre del host, la dirección IP o un comodín (Ò% Ó). Con este parámetro adicional, MySQL puede restringir aún más el acceso del usuario a la base de datos a un host o hosts en particular en un dominio. Además, esto también permite que una contraseña diferente y un conjunto de privilegios se apliquen a un usuario en función del host desde el que se realiza la conexión. Por lo tanto, el usuario scott, que inicia sesión en abc.com puede o no puede ser el mismo usuario scott que inicia sesión en xyz.com.

Privilegios

El sistema de privilegios de MySQL es un sistema jerárquico que funciona a través de la herencia. Los privilegios concedidos a un nivel superior se transmiten implícitamente a todos los niveles inferiores y pueden ser anulados por los mismos privilegios establecidos en niveles inferiores. MySQL permite otorgar privilegios a cinco niveles diferentes, en orden descendente del alcance de los privilegios:

  • Global
  • Base por huésped
  • Nivel de base de datos
  • Específico de la tabla
  • Column-specific (columna única en una sola tabla

Cada nivel tiene una tabla de subvenciones correspondiente en la base de datos. Al realizar una comprobación de privilegios, MySQL verifica cada una de las tablas en orden descendente del alcance de los privilegios, y los privilegios otorgados en un nivel inferior tienen prioridad sobre los mismos privilegios otorgados a un nivel superior.

Los privilegios soportados por MySQL se agrupan en dos tipos: privilegios administrativos y privilegios por objeto. Los privilegios administrativos son privilegios globales que tienen efectos en todo el servidor y están relacionados con el funcionamiento de MySQL. Estos privilegios administrativos incluyen el privilegio de ARCHIVO, PROCESO, REPLICACIÓN, CIERRE y SUPER. Los privilegios por objeto afectan a los objetos de la base de datos como tablas, columnas, índices y procedimientos almacenados, y se pueden otorgar con un ámbito diferente. Estos privilegios por objeto tienen el nombre de las consultas SQL que activan sus comprobaciones.

A diferencia de Oracle, no existe un concepto de rol en MySQL. Por lo tanto, para conceder a un grupo de usuarios el mismo conjunto de privilegios, los privilegios deben concederse a cada usuario por separado. Alternativamente, aunque menos satisfactorios para la auditoría, los usuarios que realizan tareas como un rol pueden compartir una sola cuenta de usuario que está designada para el “rol” y con los privilegios requeridos concedidos.

Migración de esquema

El esquema contiene las definiciones de las tablas, vistas, índices, usuarios, restricciones, procedimientos almacenados, disparadores y otros objetos específicos de la base de datos. La mayoría de las bases de datos relacionales trabajan con objetos similares.

Similitudes de objetos de esquema

Existen muchas similitudes entre los objetos de esquema en Oracle y MySQL. Sin embargo, algunos objetos de esquema difieren entre estas bases de datos. Para obtener más información acerca de los objetos de esquema, consulte Oracle SQL Reference.

Oracle MySQL
AFTER trigger trigger
BEFORE trigger trigger
Check constraint Check constraint
Column default Column default
Database Database
Foreign key Foreign key
Index Index
Package N/A
PL/SQL function Routine
PL/SQL procedure Routine
Primary key Primary key
Role N/A
Schema Schema
Sequence AUTO_INCREMENT for a column
Snapshot N/A
Synonym N/A
Table Table
Tablespace N/A
Temporary table Temporary table
Trigger for each row Trigger for each row
Unique key Unique key
User User
View View

Nombres de objetos de esquema

Oracle no distingue entre mayúsculas y minúsculas a nombres de objeto y los nombres de objeto de esquema de Oracle se almacenan en mayúsculas.

Al igual que en Oracle, columna, índice, procedimiento almacenado y nombres de disparadores, así como alias de columnas en MySQL son insensibles a mayúsculas y minúsculas en todas las plataformas. Sin embargo, la sensibilidad a mayúsculas y minúsculas de nombres de bases de datos y tablas para MySQL difiere de Oracle. En MySQL, las bases de datos corresponden a los directorios dentro del directorio de datos, y las tablas corresponden a uno o más archivos dentro del directorio de la base de datos. Como tal, la sensibilidad a mayúsculas y minúsculas de la base de datos y los nombres de las tablas se determina por la sensibilidad de los sistemas operativos subyacentes. Esto significa que los nombres de bases de datos y tablas no distinguen entre mayúsculas y minúsculas en Windows y distinguen entre mayúsculas y minúsculas en la mayoría de las variedades de Unix. Sin embargo, MySQL permite a los usuarios determinar cómo se almacenan los nombres de las bases de datos y las tablas en el disco y en su uso en MySQL a través de la variable de sistema lower_case_table_names. Los alias de tabla distinguen mayúsculas de minúsculas en las versiones anteriores a MySQL 4.1.1.

Tanto Oracle como MySQL le permiten usar palabras reservadas como nombres de objeto al representar el nombre con un identificador entre comillas. Sin embargo, MySQL permite que algunas palabras reservadas como DATE y TIMESTAMP se utilicen como identificador no cotizado para los nombres de objetos, aunque esto no está permitido en Oracle. SQL Developer agrega un subrayado (_) al nombre de un objeto MySQL que es una palabra reservada de Oracle.

MySQL y Oracle tienen algunas diferencias menores en su definición de un identificador. En MySQL, un identificador no cotizado puede comenzar con un dígito, y las comillas dobles están permitidas en un identificador entre comillas; Sin embargo, ninguno de estos se permite en un identificador de Oracle. En MySQL, el carácter de cita es el backtick (`). Si se establece el modo SQL ANSI_QUOTES, también se pueden usar comillas dobles para citar los identificadores. En Oracle, los identificadores se citan utilizando comillas dobles.

Debe elegir un nombre de objeto de esquema que sea único por cada caso y por al menos otra característica y asegúrese de que el nombre del objeto no es una palabra reservada de ninguna de las bases de datos.

Consideraciones sobre el diseño de la mesa

Esta sección analiza los problemas de diseño de tablas que debe tener en cuenta al convertir bases de datos MySQL a Oracle. Esta sección incluye lo siguiente:

Tipos de datos de caracteres

MySQL y Oracle tienen algunas diferencias en los tipos de caracteres que soportan y en la forma en que almacenan y recuperan los valores de tipo de caracteres.

MySQL admite el tipo CHAR y VARCHAR para el tipo de carácter con una longitud menor que 65.535 bytes. El tipo CHAR puede tener una longitud máxima de 255 bytes, ya partir de MySQL 3.23 también se puede declarar con una longitud de 0 byte. Antes de MySQL 5.0.3, la especificación de longitud para el tipo VARCHAR es la misma que el tipo CHAR. Desde MySQL 5.0.3, la longitud máxima para el tipo VARCHAR es de 65.535 bytes. Oracle admite cuatro tipos de caracteres: CHAR, NCHAR, NVARCHAR2 y VARCHAR2. La longitud mínima que se puede declarar para todos los tipos de caracteres de Oracle es de 1 byte. El tamaño máximo permitido para CHAR y NCHAR es 2.000 bytes, y para NVARCHAR2 y VARCHAR2 es 4.000 bytes.

Los valores de MySQL CHAR están rellenados a la derecha con espacios a la longitud especificada cuando se almacenan, y los espacios finales se eliminan cuando se recuperan los valores. Por otro lado, los valores de VARCHAR se almacenan usando tantos caracteres como se dan, pero antes de que MySQL 5.0.3 se retiren los espacios finales cuando los valores son almacenados y recuperados. Oracle blank-pads el valor de su CHAR y NCHAR tipo a la longitud de la columna si el valor es más corto que la longitud de la columna, y los espacios finales no se eliminan en la recuperación. Para las columnas de tipo de datos NVARCHAR2 y VARVHAR2, Oracle almacena y recupera el valor exactamente como se da, incluidos los espacios finales.

Si se asigna un valor a una columna de tipo de carácter que excede su longitud especificada, MySQL trunca el valor y no genera un error a menos que se establezca el modo SQL STRICT. Oracle genera un error si el valor asignado a una columna de tipo de carácter excede su longitud especificada.

En MySQL, cada columna de tipo de carácter (CHAR, VARCHAR, y TEXT) tiene un conjunto de caracteres de columna y una colación. Si el conjunto de caracteres o la intercalación no se define explícitamente en la definición de columna, el conjunto de caracteres de tabla o colación está implícito si se especifica; De lo contrario, se elige el carácter de base de datos o la intercalación. En Oracle, el conjunto de caracteres para los tipos CHAR y VARCHAR2 está definido por el conjunto de caracteres de la base de datos y para el conjunto de caracteres para los tipos NCHAR y NVARCHAR se define el conjunto de caracteres nacionales.

Al declarar un tipo CHAR o VARCHAR en MySQL, la longitud semántica predeterminada es caracteres en lugar de bytes para MySQL 4.1 y posteriores. En Oracle, la longitud semántica predeterminada es bytes para tipos CHAR y VARCHAR2 y caracteres para tipos NCHAR y NVARCHAR2.

SQL Developer asignará los tipos CHAR y VARCHAR de MySQL a los tipos CHAR y VARCHAR2 de Oracle, respectivamente. SQL Developer determinará el número máximo de bytes para las columnas de tipo de datos CHAR de Oracle y VARCHAR2 del número de bytes requeridos para mantener la longitud máxima especificada para las columnas de tipo de datos CHAR y VARCHAR de MySQL correspondientes. Si la columna VARCHAR2 de MySQL es tal que los datos superan los 4000 bytes, convierta la columna en una columna de tipo de datos Oracle CLOB.

Valor predeterminado de la columna

MySQL difiere de Oracle en la forma en que maneja el valor predeterminado para una columna que no permite el valor NULL.

En MySQL, para una columna que no permite valor NULL y para la cual no se proporcionan datos para la columna cuando se insertan datos en la tabla, MySQL determina un valor predeterminado para la columna. Este valor predeterminado es el valor predeterminado implícito para el tipo de datos de columna. Sin embargo, si el modo estricto está habilitado, MySQL genera errores, y para las tablas transaccionales se deshace la instrucción insert.

En Oracle, cuando los datos se insertan en una tabla, se deben proporcionar datos para todas las columnas que no permiten el valor NULL. Oracle no genera un valor predeterminado para las columnas que tienen la restricción NOT NULL.

Migración de varias bases de datos

SQL Developer soporta la migración de múltiples bases de datos MySQL si están en el mismo servidor de base de datos MySQL.

Consideraciones de migración de esquema para MySQL

Consideraciones de migración de esquema para MySQL se aplican en las siguientes áreas

Bases de datos

Al migrar bases de datos MySQL a Oracle, SQL Developer asigna cada base de datos MySQL a un tablespace en Oracle. Los objetos de base de datos, como tablas, índices y vistas, se almacenan en los respectivos espacios de tabla y se hacen referencia desde el esquema de Oracle para el usuario que los posee.

Asignación de privilegios globales y de nivel de base de datos de MySQL a los privilegios del sistema Oracle

SQL Developer no procesa todos los privilegios administrativos en MySQL, excepto el privilegio SUPER. La Tabla 2-2 muestra las asignaciones de privilegios por objeto de MySQL otorgadas en los diferentes niveles, así como el privilegio SUPER concedido a nivel global.

Level Privilege System Privilege(s) on Oracle
Global ALTER ALTER ANY TABLE, ALTER ANY SEQUENCE, ALTER ANY CUSTER, COMMENT ANY TABLE
Global ALTER ROUTINE ALTER ANY PROCEDURE, DROP ANY PROCEDURE
Global CREATE CREATE ANY TABLE, CREATE ANY SEQUENCE, CREATE ANY CLUSTER, CREATE DATABASE LINK, COMMENT ANY TABLE
Global CREATE ROUTINE CREATE ANY PROCEDURE
Global CREATE USER CREATE USER, GRANT ANY PRIVILEGE
Global CREATE VIEW CREATE ANY VIEW
Global DELETE ALTER ANY TABLE, DROP USER, DELETE ANY TABLE
Global DROP DROP ANT TABLE, DROP ANY SEQUENCE, DROP ANY CLUSTER, DROP ANY VIEW
Global EXECUTE EXECUTE ANY PROCEDURE
Global INDEX CREATE ANY INDEX, ALTER ANY INDEX, DROP ANY INDEX
Global INSERT INSERT ANY TABLE
Global LOCK TABLES LOCK ANY TABLE
Global SELECT SELECT ANY TABLE
Global SUPER CREATE ANY TRIGGER, DROP ANY TRIGGER
Global UPDATE UPDATE ANY TABLE
Global USAGE CREATE SESSION, ALTER SESSION, UNLIMITED TABLESPACE
Database CREATE CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE TABLE
Database CREATE ROUTINE CREATE PROCEDURE
Database CREATE VIEW CREATE VIEW
Table CREATE CREATE TABLE
Table CREATE VIEW CREATE VIEW

Tablas Temporales

SQL Developer no admite la migración de tablas temporales.

En MySQL, las tablas temporales son objetos de base de datos que son visibles sólo a la sesión de usuario actual y se descartan automáticamente cuando termina la sesión de usuario.

La definición de tablas temporales en Oracle difiere ligeramente de MySQL, ya que las tablas temporales, una vez creadas, existen hasta que se descartan explícitamente y son visibles para todas las sesiones con privilegios apropiados. Sin embargo, los datos de las tablas temporales sólo son visibles para la sesión de usuario que inserta los datos en la tabla y los datos pueden persistir durante la duración de una transacción o una sesión de usuario.

Propietario de objetos de esquema

SQL Developer crea un esquema de Oracle para el usuario root de MySQL que posee, para todas las bases de datos que se van a migrar, todos los objetos de base de datos excepto los procedimientos almacenados. Para los procedimientos almacenados, los usuarios de MySQL que los crearon siguen siendo el propietario. SQL Developer crea un esquema de Oracle para cada usuario de MySQL que se migra.

Tipos de datos

A continuación describiré los tipos de datos utilizados en Oracle, mostrando los tipos de datos MySQL y el equivalente de Oracle.

Tipos de datos de Oracle soportados

Data Type Description
BLOB A binary large object. Maximum size is 4 gigabytes.
CHAR (SIZE) Fixed-length character data of length size bytes. Maximum size is 2000 bytes. Default and minimum size is 1 byte.
CLOB A character large object containing single-byte characters. Both fixed-width and variable-width character sets are supported, both using the CHAR database character set. Maximum size is 4 gigabytes.
DATE The DATE data type stores date and time information. Although date and time information can be represented in both CHAR and NUMBER data types, the DATE data type has special associated properties. For each DATE value, Oracle stores the following information: century, year, month, day, hour, minute, and second.
FLOAT Specifies a floating-point number with decimal precision 38, or binary precision 126.
LONG (SIZE) Character data of variable length up to 2 gigabytes, or 2^31 -1 bytes.
LONG RAW Raw binary data of variable length up to 2 gigabytes.
NCHAR (SIZE) Fixed-length character data of length size characters or bytes, depending on the choice of national character set. Maximum size is determined by the number of bytes required to store each character, with an upper limit of 2000 bytes. Default and minimum size is 1 character or 1 byte, depending on the character set.
NCLOB A character large object containing multibyte characters. Both fixed-width and variable-width character sets are supported, both using the NCHAR database character set. Maximum size is 4 gigabytes. Stores national character set data.
NUMBER Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127.
NVARCHAR2 (SIZE) Variable-length character string having maximum length size characters or bytes, depending on the choice of national character set. Maximum size is determined by the number of bytes required to store each character, with an upper limit of 4000 bytes. You must specify size for NVARCHAR2.
RAW (SIZE) Raw binary data of length size bytes. Maximum size is 2000 bytes. You must specify size for a RAW value.
VARCHAR (SIZE) The VARCHAR data type is currently synonymous with the VARCHAR2 data type. Oracle recommends that you use VARCHAR2 rather than VARCHAR. In the future, VARCHAR might be defined as a separate data type used for variable-length character strings compared with different comparison semantics. The maximum size is 4000 and the minimum of 1 is the default.
BINARY_DOUBLE A 64-bit, double-precision floating-point number data type.
BINARY_FLOAT A 32-bit, single-precision floating-point number data type.

Para obtener más información sobre los tipos de datos de Oracle, consulte Oracle Database SQL Language Reference

 Asignaciones de tipo de datos predeterminadas

Les mostraré los valores predeterminados utilizados por SQL Developer para convertir tipos de datos de MySQL a Oracle. SQL Developer le permite cambiar la configuración predeterminada para ciertos tipos de datos especificando un tipo alternativo. Para obtener información acerca de cómo cambiar las asignaciones predeterminadas de tipos de datos, consulte la ayuda en línea de SQL Developer.

MySQL Data Type Oracle Data Type
BIGINT NUMBER(19, 0)
BIT RAW
BLOB BLOB, RAW
CHAR CHAR
DATE DATE
DATETIME DATE
DECIMAL FLOAT (24)
DOUBLE FLOAT (24)
DOUBLE PRECISION FLOAT (24)
ENUM VARCHAR2
FLOAT FLOAT
INT NUMBER(10, 0)
INTEGER NUMBER(10, 0)
LONGBLOB BLOB, RAW
LONGTEXT CLOB, RAW
MEDIUMBLOB BLOB, RAW
MEDIUMINT NUMBER(7, 0)
MEDIUMTEXT CLOB, RAW
NUMERIC NUMBER
REAL FLOAT (24)
SET VARCHAR2
SMALLINT NUMBER(5, 0)
TEXT VARCHAR2, CLOB
TIME DATE
TIMESTAMP DATE
TINYBLOB RAW
TINYINT NUMBER(3, 0)
TINYTEXT VARCHAR2
VARCHAR VARCHAR2, CLOB
YEAR NUMBER

Nota: Los tipos de datos ENUM y SET no tienen mapeo directo en Oracle. SQL Developer asigna columnas ENUM en MySQL a columnas VARCHAR2 en Oracle. A continuación, agrega una restricción y un disparador a esas columnas para garantizar que sólo los valores permitidos por el tipo de datos ENUM se permiten en la columna en la que se asignó en Oracle.

Comparación de tipos de datos

En esta sección se muestra la diferencia entre los tipos de datos MySQL y Oracle. Para algunos tipos de datos de MySQL hay más de un tipo de datos Oracle alternativo. Las tablas incluyen información sobre lo siguiente:

Tipos Numéricos

Cuando se asignan tipos de datos MySQL a tipos de datos numéricos en Oracle, se aplican las siguientes condiciones:

  • Si no hay precisión o escala definida para el tipo de datos Oracle de destino, la precisión y la escala se toman del tipo de datos fuente de MySQL.
  • Si hay una precisión o escala definida para el tipo de datos de destino, estos valores se comparan con los valores equivalentes del tipo de datos fuente y se selecciona el valor máximo.

La siguiente tabla compara los tipos numéricos de MySQL con Oracle:

MySQL Size Oracle
BIGINT 8 Bytes NUMBER (19,0)
BIT approximately (M+7)/8 Bytes RAW
DECIMAL(M,D) M+2 bytes if D > 0, M+1 bytes if D = 0 (D+2, if M < D) FLOAT(24), BINARY_FLOAT
DOUBLE 8 Bytes FLOAT(24), BINARY_FLOAT, BINARY_DOUBLE
DOUBLE PRECION 8 Bytes FLOAT(24), BINARY_DOUBLE
FLOAT(25<=X <=53) 8 Bytes FLOAT(24), BINARY_FLOAT
FLOAT(X<=24) 4 Bytes FLOAT, BINARY_FLOAT
INT 4 Bytes NUMBER (10,0)
INTEGER 4 Bytes NUMBER (10,0)
MEDIUMINT 3 Bytes NUMBER (7,0)
NUMERIC M+2 bytes if D > 0, M+1 bytes if D = 0 (D+2, if M < D) NUMBER
REAL 8 Bytes FLOAT(24), BINARY_FLOAT
SMALLINT 2 Bytes NUMBER(5,0)
TINYINT 1 Byte NUMBER(3,0)

Tipos de fecha y hora

La siguiente tabla compara los tipos de fecha y hora de MySQL con Oracle:

MySQL Size Oracle
DATE 3 Bytes DATE
DATETIME 8 Bytes DATE
TIMESTAMP 4 Bytes DATE
TIME 3 Bytes DATE
YEAR 1 Byte NUMBER

Tipos de cadenas

Cuando se asignan tipos de datos MySQL a tipos de datos de caracteres en Oracle, se aplican las siguientes condiciones:

  • Si no hay longitud definida para el tipo de datos de destino, la longitud se toma del tipo de datos de origen.
  • Si hay una longitud definida para el tipo de datos de destino, se toma el valor máximo de las dos longitudes.

La siguiente tabla compara los tipos de cadenas de MySQL con Oracle:

MySQL Size Oracle
BLOB L + 2 Bytes whereas L<2^16 RAW, BLOB
CHAR(m) M Bytes, 0<=M<=255 CHAR
ENUM (VALUE1, VALUE2, …) 1 or 2 Bytes depending on the number of enum. values (65535 values max)
LONGBLOB L + 4 Bytes whereas L < 2 ^ 32 RAW, BLOB
LONGTEXT L + 4 Bytes whereas L < 2 ^ 32 RAW, CLOB
MEDIUMBLOB L + 3 Bytes whereas L < 2^ 24 RAW, BLOB
MEDIUMTEXT L + 3 Bytes whereas L < 2^ 24 RAW, CLOB
SET (VALUE1, VALUE2, …) 1, 2, 3, 4 or 8 Bytes depending on the number of set members (64 members maximum)
TEXT L + 2 Bytes whereas L<2^16 VARCHAR2, CLOB
TINYBLOB L + 1 Bytes whereas L<2 ^8 RAW, BLOB
TINYTEXT L + 1 Bytes whereas L<2 ^8 VARCHAR2
VARCHAR(m) L+1 Bytes whereas L<=M and0<=M<=255 before MySQL 5.0.3 (0 <= M <= 65535 in MySQL 5.0.3 and later; effective maximum length is 65,532 bytes) VARCHAR2, CLOB

Nota: La referencia a M indica el tamaño máximo de la pantalla. El tamaño máximo de visualización legal es 255. Una referencia a L se aplica a tipos de punto flotante e indica el número de dígitos que siguen al punto decimal.

Conceptos de almacenamiento de datos

Para ver esta sección entra en Data Storage Concepts.

Una base de datos Oracle consta de uno o más tablespaces. Los espacios de tabla proporcionan espacio de almacenamiento lógico que vincula una base de datos a los discos físicos que contienen los datos. Un espacio de tabla se crea a partir de uno o más archivos de datos. Los archivos de datos son archivos del sistema de archivos o un área de espacio en disco especificada por un dispositivo sin procesar. Un espacio de tablas puede ampliarse agregando más archivos de datos.

Una base de datos Oracle consta de al menos un espacio de tabla SYSTEM, donde se almacenan las tablas de Oracle. También puede consistir en tablespaces definidos por el usuario. Un espacio de tabla es la ubicación de almacenamiento lógico para objetos de base de datos. Por ejemplo, puede especificar dónde se creará una tabla o índice particular en el espacio de tablas.

Y así culmina nuestra comparativa entre Oracle vs MySQL, si te gusto comparte y déjanos tus comentarios a través de tus redes sociales.


2 Comments

Profesor Yeow · May 29, 2020 at 10:33 am

Excelente articulo y analisis, sin desperdicio alguno. Muchas gracias.

Diferencia Entre Mysql Y Mysqli – twtr · December 8, 2020 at 4:09 am

[…] Download Plan More @ arbo.com.ve […]

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *