Este documento forma parte de una serie que proporciona información y directrices clave relacionadas con la planificación y la realización de migraciones de bases de datos Oracle® 11g/12c a instancias de segunda generación de Cloud SQL para MySQL versión 5.7. La serie incluye las siguientes partes:
- Migrar usuarios de Oracle a Cloud SQL para MySQL: terminología y funciones
- Migrar usuarios de Oracle a Cloud SQL para MySQL: tipos de datos, usuarios y tablas (este documento)
- Migrar usuarios de Oracle a Cloud SQL para MySQL: consultas, procedimientos almacenados, funciones y activadores
- Migrar usuarios de Oracle a Cloud SQL para MySQL: seguridad, operaciones, monitorización y registro
Tipos de datos
MySQL proporciona varios tipos de datos que son totalmente equivalentes o similares a los tipos de datos proporcionados por Oracle. En la siguiente tabla se enumeran los tipos de datos de MySQL más habituales, seguidos de una comparación entre los tipos de datos primitivos de Oracle y los tipos de datos de MySQL correspondientes. Cuando no se admite un tipo de datos, se indica un tipo de datos alternativo. Ten en cuenta que una base de datos MySQL 5.7 tiene un límite de 65.535 bytes para toda la fila (en función del conjunto de caracteres utilizado).
Tipos de datos primitivos de MySQL 5.7
Familia de tipos de datos de MySQL | Nombre del tipo de datos de MySQL | Especificación del tipo de datos |
---|---|---|
Cadena o carácter |
CHAR(n) |
Almacena exactamente n caracteres. |
VARCHAR(n) |
Almacena un número variable de caracteres, hasta un máximo de n caracteres. |
|
BINARY |
Almacena exactamente n bytes. |
|
VARBINARY(n) |
Almacena un número variable de caracteres, hasta un máximo de n bytes. |
|
BLOB |
Objeto binario grande que puede contener una cantidad variable de datos. | |
TEXT |
Variante específica de VARCHAR que no requiere que especifiques un límite superior en el número de caracteres. |
|
ENUM |
Objeto de cadena con un valor elegido de una lista de valores permitidos que se enumeran explícitamente en la especificación de la columna cuando se crea la tabla. | |
SET |
Objeto de cadena que puede tener cero o más valores. Cada uno de ellos debe elegirse de una lista de valores permitidos especificada cuando se crea la tabla. | |
Numérico | INT |
El valor mínimo es -2147483648 y el máximo, 2147483647. |
INTEGER |
El valor mínimo es -2147483648 y el máximo, 2147483647. | |
TINYINT |
El valor mínimo es -128 y el máximo, 127. | |
SMALLINT |
El valor mínimo es -32768 y el máximo, 32767. | |
MEDIUMINT |
El valor mínimo es -8388608 y el máximo, 8388607. | |
BIGINT |
El valor mínimo es -2^63 y el máximo es 2^63-1. | |
DECIMAL(p,s) |
Puede almacenar cualquier valor con p dígitos y s decimales. |
|
NUMERIC(p,s) |
Puede almacenar cualquier valor con p dígitos y s decimales. |
|
FLOAT(m,d) |
Los valores pueden almacenarse con un máximo de m dígitos en total, de los cuales d pueden estar después del punto decimal. |
|
DOUBLE(m,d) |
Los valores pueden almacenarse con un máximo de m dígitos en total, de los cuales d pueden estar después del punto decimal. |
|
BIT(m) |
Almacenamiento de valores de m bits. m puede
oscilar entre 1 y 64. |
|
Fecha y hora | DATE |
- Valores con una parte de fecha, pero sin parte de hora. - Obtiene y muestra los valores de DATE en formato 'YYYY-MM-DD' .- El intervalo admitido es de '1000-01-01' a
'9999-12-31' . |
DATETIME |
- Valores que contienen tanto la fecha como la hora. - Obtiene y muestra los valores de DATETIME en formato 'YYYY-MM-DD HH:MM:SS' .- El intervalo admitido es de '1000-01-01 00:00:00' a
'9999- 12-31 23:59:59' . |
|
TIMESTAMP |
- Valores que contienen tanto la fecha como la hora. - TIMESTAMP tiene un intervalo de '1970-01-01
00:00:01' (UTC) a '2038-01-19 03:14:07' (UTC). |
|
TIME |
- Los valores pueden ir de '-838:59:59' a '838:59:59' .- La parte de las horas puede ser tan grande porque el tipo TIME
se puede usar no solo para representar una hora del día (que debe ser inferior a 24
horas), sino también el tiempo transcurrido o un intervalo de tiempo entre dos eventos (que
puede ser mucho mayor que 24 horas o incluso negativo). |
|
YEAR |
- YEAR Tipo de 1 byte que se usa para representar valores de año.- Se puede declarar como YEAR o
YEAR(n) y tiene un ancho de visualización de
n caracteres. |
|
JSON | JSON |
Datos JSON textuales como tipo de datos. |
Espacial (geometría) |
GEOMETRY |
El tipo de columna que se debe especificar cuando se quieran usar los modelos de datos que se indican en el resto de esta tabla. |
POINT |
Valor de (x,y) . |
|
LINESTRING |
Una línea (pt1, pt2) . |
|
POLYGON |
Una secuencia de puntos, que es como un trazado cerrado. | |
MULTIPOINT |
Colección de valores POINT . |
|
MULTI-LINESTRING |
Colección de valores LINE . |
|
MULTIPOLYGON |
Colección de valores POLYGON . |
|
GEOMETRY-COLLECTION |
Colección de tipos de datos de geometría. | |
Lógico | BOOLEAN |
- Contiene un valor verdadero o falso. - Acepta valores como TRUE , '1' y 1 como verdaderos.- Usa 1 byte de almacenamiento y puede almacenar NULL . |
Conversión de tipos de datos de Oracle a MySQL
Familia de tipos de datos de Oracle | Nombre del tipo de datos de Oracle | Especificación del tipo de datos de Oracle | Equivalente de MySQL en Oracle | Alternativa o equivalente de MySQL |
---|---|---|---|---|
Cadena/ Carácter |
CHAR(n) |
Tamaño máximo de 2000 bytes. | Sí | CHAR(n) |
CHARACTER(n) |
Tamaño máximo de 2000 bytes. | Sí | CHARACTER(n) |
|
NCHAR(n) |
Tamaño máximo de 2000 bytes. | Sí | NCHAR(n) |
|
VARCHAR(n) |
Tamaño máximo de 2000 bytes. | Sí | VARCHAR(n) |
|
NCHAR VARYING(n) |
Cadena UTF-8 de longitud variable. Tamaño máximo de 4000 bytes. |
Sí | NCHAR VARYING(n) |
|
VARCHAR2(n) 11g |
Tamaño máximo de 4000 bytes Tamaño máximo de 32 KB en PL/SQL. | No | VARCHAR(n) |
|
VARCHAR2(n) 12g |
Tamaño máximo de 32.767 bytes MAX_STRING_SIZE=EXTENDED . |
No | VARCHAR(n) |
|
NVARCHAR2(n) |
Tamaño máximo de 4000 bytes. | No | VARCHAR(n) |
|
LONG |
Tamaño máximo de 2 GB. | Sí | LONG |
|
RAW(n) |
Tamaño máximo de 2000 bytes. | No | VARBINARY(n) |
|
LONG RAW |
Tamaño máximo de 2 GB. | No | LONGTEXT |
|
Numérico | NUMBER |
Número de punto flotante. | No | NUMERIC/DECIMAL(p,s) |
Numérico | NUMBER |
Número de punto flotante. | No | NUMERIC/DECIMAL(p,s) |
NUMBER(*) |
Número de punto flotante. | No | DOUBLE |
|
NUMERIC(p,s) |
La precisión puede oscilar entre 1 y 38. | Sí | NUMERIC(p,s) |
|
FLOAT(p) |
Número de punto flotante. | Sí | FLOAT(p) |
|
DEC(p,s) |
Número de punto fijo. | Sí | DEC(p,s) |
|
DECIMAL(p,s) |
Número de punto fijo. | Sí | DECIMAL(p,s) |
|
INT |
Número entero de 38 dígitos. | Sí | INT |
|
INTEGER |
Número entero de 38 dígitos. | Sí | INTEGER |
|
SMALLINT |
Número entero de 38 dígitos. | Sí | SMALLINT |
|
REAL |
Número de punto flotante. | Sí | REAL |
|
DOUBLE PRECISION |
Número de punto flotante. | Sí | DOUBLE PRECISION |
|
Fecha y hora | DATE |
Almacena datos de fecha y hora (año, mes, día, hora, minuto y segundo). | Sí | DATE |
TIMESTAMP(p) |
Fecha y hora con fracción. | Sí | TIMESTAMP |
|
TIMESTAMP(p) WITH TIME ZONE |
Fecha y hora con fracción y zona horaria. | No | DATETIME(n) |
|
INTERVAL YEAR(p) TO MONTH |
Intervalo de fechas. | No | VARCHAR(n) |
|
INTERVAL DAY(p) TO SECOND(s) |
Intervalo de día y hora. | No | VARCHAR(n) |
|
Lógico | BOOLEAN |
Valores TRUE , FALSE y NULL . No se puede asignar a una columna de tabla de base de datos. |
Sí | BOOLEAN |
XML | XMLTYPE |
Datos XML. | No | LONGTEXT |
LOB | BFILE |
Puntero a un archivo binario con un tamaño máximo de 4 GB. | No | VARCHAR(255) |
CLOB |
Objeto grande de caracteres con un tamaño máximo de archivo de 4 GB. | No | LONGTEXT |
|
BLOB |
Objeto binario grande con un tamaño máximo de 4 GB. | Sí | BLOB |
|
NCLOB |
Cadena Unicode de longitud variable con un tamaño máximo de archivo de 4 GB. | No | LONGTEXT |
|
ROWID | ROWID |
Dirección física de la fila. | No | CHAR(n) |
UROWID(n) |
ID de fila universal de las direcciones de fila lógicas. | No | VARCHAR(n) |
|
Espacial | SDO_GEOMETRY |
Descripción geométrica de un objeto espacial. | No | N/A |
SDO_TOPO_GEOMETRY |
Describe una geometría de topología. | No | N/A |
|
SDO_GEORASTER |
Una cuadrícula ráster o un objeto de imagen se almacenan en una sola fila. | No | N/A |
|
Tipos de contenido multimedia | ORDDicom |
Admite el almacenamiento y la gestión de datos de audio. | No | N/A |
ORDDicom |
Admite el almacenamiento y la gestión de datos de Digital Imaging and Communications in Medicine (DICOM). | No | N/A |
|
ORDDoc |
Admite el almacenamiento y la gestión de cualquier tipo de datos multimedia. | No | N/A |
|
ORDImage |
Admite el almacenamiento y la gestión de datos de imagen. | No | N/A |
|
ORDVideo |
Admite el almacenamiento y la gestión de datos de vídeo. | No | N/A |
Tipos definidos por el usuario
Oracle se refiere a los tipos definidos por el usuario (UDTs) como OBJECT TYPES
, que se gestionan con PL/SQL. Los tipos definidos por el usuario permiten crear tipos de datos complejos específicos de la aplicación que se basan en la lista de tipos de datos de Oracle integrada y la amplían.
A continuación, se muestra un ejemplo de UDT de Oracle:
SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
PHONE_NUM VARCHAR2(11));
Notas de conversión
MySQL no permite que los usuarios creen tipos definidos específicos.
Usuarios y tablas
En esta sección se explica cómo crear usuarios y asignarles permisos, así como la necesidad de convertir tablas de Oracle en tablas de Cloud SQL para MySQL.
Creación de usuarios y permisos
Las cuentas de usuario de la base de datos de Oracle (los términos "usuario" y "esquema" de Oracle son idénticos) se pueden usar para autenticar y conectar con sesiones de bases de datos, mientras que el acceso de autorización se define a nivel individual de cada usuario para objetos y permisos de bases de datos específicos.
En general, hay dos tipos de usuarios de bases de datos:
- Administradores: gestionan la instancia de base de datos, los usuarios y los recursos.
- Cuentas de usuario: sirven para operaciones lógicas, como aplicaciones.
Los administradores conceden privilegios a las cuentas de usuario y de usuario de aplicación para acceder a los objetos de la base de datos. Los permisos de la base de datos de Oracle se conceden a un usuario para operaciones específicas (por ejemplo, crear una sesión o conectarse) o para objetos de base de datos específicos (por ejemplo, SELECT
en una tabla específica o EXECUTE
en un procedimiento almacenado específico).
Consideraciones sobre las conversiones
- La sintaxis de MySQL
CREATE USER
es diferente de la de Oracle y no se puede migrar tal cual. Además, ambas bases de datos tienen una arquitectura de usuario diferente. - Cuando un administrador crea un usuario en MySQL, debe especificar el servidor al que debe conectarse el usuario para acceder a la base de datos. El servidor puede ser una dirección IP o un DNS específicos, o bien puede conectarse desde todas las fuentes (para ello, se usa el signo de comodín %).
- Como el nombre de usuario de MySQL es un archivo adjunto de dos partes entre el nombre de usuario y el servidor desde el que se le permitiría conectarse, se puede crear un usuario con el mismo nombre, pero desde un servidor diferente como dirección de cliente (IP o DNS).
- Una vez creado el usuario, se le pueden conceder permisos para acceder a objetos de bases de datos que formen parte de una base de datos o un esquema específicos.
- También se pueden conceder permisos adicionales a los usuarios según los permisos permitidos de Cloud SQL para MySQL (por ejemplo, el usuario raíz tendrá todos los privilegios excepto los privilegios
SUPER
yFILE
). Los usuarios de Oracle se pueden asociar a un espacio de tabla dedicado en MySQL, por lo que esta función no es relevante.
Tablas
Las tablas de Oracle se componen de muchos elementos, como tipos de datos de columna, restricciones de tabla, índices, particiones, funciones propias de las tablas de Oracle y más. Para migrar correctamente a las tablas de bases de datos de Cloud SQL para MySQL, todos los elementos de las tablas de Oracle deben convertirse en tablas de MySQL. Algunos elementos se admiten sin modificaciones o con modificaciones menores, mientras que otros deben modificarse por completo.
Desde el punto de vista de la migración, convertir PL/SQL en MySQL probablemente requiera más esfuerzo, ya que convertir tablas de Oracle en tablas de MySQL es una fase crucial con una importancia significativa y más implicaciones en el rendimiento y el tamaño de los datos.
Estas son las principales diferencias entre las tablas de Oracle y MySQL, así como las funciones relacionadas. Estas diferencias se analizan en el resto de la serie.
- Distinción entre mayúsculas y minúsculas (nombres de tablas y columnas)
- Sintaxis para crear tablas
- Metadatos de tablas e índices
- Compatibilidad con restricciones
- Tipos de datos admitidos y limitaciones
- Índices
- Particiones y gestión de particiones
- Mantenimiento de tablas e índices
- Tablas temporales
- Vistas
- Columnas visibles e invisibles (Oracle 12c)
- Conjuntos de caracteres de tablas y columnas