Este documento es parte de una serie que proporciona información clave y orientación relacionada con la planificación y la realización de migraciones de bases de datos de Oracle® 11g o 12c a instancias de segunda generación con versión 5.7 de Cloud SQL para MySQL. En la serie, se incluyen las siguientes partes:
- Migra usuarios de Oracle a Cloud SQL para MySQL: terminología y funcionalidad
- Migra usuarios de Oracle a Cloud SQL para MySQL: usuarios, tablas y tipos de datos (este documento)
- Migra usuarios de Oracle a Cloud SQL para MySQL: consultas, procedimientos almacenados, funciones y activadores
- Migra usuarios de Oracle a Cloud SQL para MySQL: seguridad, operaciones, supervisión y registro
Tipos de datos
MySQL proporciona varios tipos de datos que son equivalentes o similares a los tipos de datos que proporciona Oracle. En la siguiente tabla, se enumeran los tipos de datos de MySQL más comunes, seguidos de una comparación entre los tipos de datos básicos de Oracle y los tipos de datos de MySQL correspondientes; si no se admite un tipo de datos, se muestra uno alternativo. Ten en cuenta que una base de datos MySQL 5.7 tiene un límite de 65,535 bytes para toda la fila (según el grupo de caracteres usado).
Tipos de datos básicos de MySQL 5.7
Familia de tipos de datos de MySQL | Nombre del tipo de datos de MySQL | Especificación del tipo de datos |
---|---|---|
Strings/ caracteres |
CHAR(n) |
Almacena n caracteres con exactitud. |
VARCHAR(n) |
Almacena una cantidad variable de caracteres, hasta un máximo de n caracteres. |
|
BINARY |
Almacena n bytes con exactitud. |
|
VARBINARY(n) |
Almacena una cantidad variable de caracteres, hasta un máximo de n bytes. |
|
BLOB |
Es un objeto binario grande que puede contener una cantidad variable de datos. | |
TEXT |
Es una variante específica de VARCHAR que no requiere que especifiques un límite superior en la cantidad de caracteres. |
|
ENUM |
Es un objeto de string con un valor elegido de una lista de valores permitidos que se enumeran de forma explícita en la especificación de la columna cuando se crea la tabla. | |
SET |
Es un objeto de string que puede tener cero o más valores, cada uno de los cuales debe elegirse de una lista de valores permitidos especificados cuando se crea la tabla. | |
Numérico | INT |
El valor mínimo es −2147483648 | El valor máximo es 2147483647. |
INTEGER |
El valor mínimo es −2147483648 | El valor máximo es 2147483647. | |
TINYINT |
El valor mínimo es −128 | El valor máximo es 127. | |
SMALLINT |
El valor mínimo es −32768 | El valor máximo es 32767. | |
MEDIUMINT |
El valor mínimo es −8388608 | El valor máximo es 8388607. | |
BIGINT |
El valor mínimo es 2^63 | El valor máximo es 2^63−1. | |
DECIMAL(p,s) |
Es capaz de almacenar cualquier valor con p dígitos y s decimales. |
|
NUMERIC(p,s) |
Es capaz de almacenar cualquier valor con p dígitos y s decimales. |
|
FLOAT(m,d) |
Los valores se pueden almacenar con un máximo de m dígitos, de los cuales d dígitos pueden estar después del punto decimal. |
|
DOUBLE(m,d) |
Los valores se pueden almacenar con un máximo de m dígitos, de los cuales d dígitos pueden estar después del punto decimal. |
|
BIT(m) |
Almacenamiento de valores m -bit. m puede ser un valor entre 1 y 64. |
|
Fecha y hora | DATE |
- Son valores con una parte de fecha, pero sin parte de tiempo. - Este tipo recupera y muestra los valores DATE en formato 'YYYY-MM-DD' .- El rango admitido es de '1000-01-01' a '9999-12-31' . |
DATETIME |
- Son valores que contienen partes de fecha y hora. - Este tipo recupera y muestra los valores DATETIME en formato 'YYYY-MM-DD HH:MM:SS' .- El rango admitido es de '1000-01-01 00:00:00' a '9999- 12-31 23:59:59' . |
|
TIMESTAMP |
- Son valores que contienen partes de fecha y hora. - TIMESTAMP tiene un rango de '1970-01-01
00:00:01' UTC a '2038-01-19 03:14:07' UTC. |
|
TIME |
- Los valores pueden ser entre '-838:59:59' y '838:59:59' .- La parte de horas puede ser muy grande porque el tipo TIME puede usarse para representar no solo una hora del día (que debe ser inferior a 24 horas), sino también un intervalo entre dos eventos (que pueden ser valores que superen las 24 horas o incluso valores negativos). |
|
YEAR |
- Tipo de 1 byte YEAR usado 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 |
Son datos JSON textuales como un tipo de datos. |
Espaciales (geometría) |
GEOMETRY |
Es el tipo de columna que se debe especificar cuando se usan los modelos de datos que se detallan en el resto de esta tabla. |
POINT |
Es un valor (x,y) . |
|
LINESTRING |
Es una línea (pt1, pt2) . |
|
POLYGON |
Es una secuencia de puntos, en efecto una ruta de acceso cerrada. | |
MULTIPOINT |
Es una colección de valores POINT . |
|
MULTI-LINESTRING |
Es una colección de valores LINE . |
|
MULTIPOLYGON |
Es una colección de valores POLYGON . |
|
GEOMETRY-COLLECTION |
Es una colección de tipos de datos de geometría. | |
Lógicos | 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 | Tipo equivalente de MySQL en Oracle | Opción de MySQL correspondiente o alternativa |
---|---|---|---|---|
Strings/ Caracteres |
CHAR(n) |
El tamaño máximo es de 2,000 bytes. | Sí | CHAR(n) |
CHARACTER(n) |
El tamaño máximo es de 2,000 bytes. | Sí | CHARACTER(n) |
|
NCHAR(n) |
El tamaño máximo es de 2,000 bytes. | Sí | NCHAR(n) |
|
VARCHAR(n) |
El tamaño máximo es de 2,000 bytes. | Sí | VARCHAR(n) |
|
NCHAR VARYING(n) |
String UTF-8 de extensión variable El tamaño máximo es de 4,000 bytes. |
Sí | NCHAR VARYING(n) |
|
VARCHAR2(n) 11g |
El tamaño máximo es de 4,000 bytes El tamaño máximo es de 32 KB en PL/SQL. | No | VARCHAR(n) |
|
VARCHAR2(n) 12g |
El tamaño máximo es de 32,767 bytes MAX_STRING_SIZE=EXTENDED . |
No | VARCHAR(n) |
|
NVARCHAR2(n) |
El tamaño máximo es de 4,000 bytes. | No | VARCHAR(n) |
|
LONG |
El tamaño máximo es de 2 GB. | Sí | LONG |
|
RAW(n) |
El tamaño máximo es de 2,000 bytes. | No | VARBINARY(n) |
|
LONG RAW |
El tamaño máximo es 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 variar de 1 a 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 fecha. | No | VARCHAR(n) |
|
INTERVAL DAY(p) TO SECOND(s) |
Intervalo de tiempo y día. | No | VARCHAR(n) |
|
Lógicos | 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 |
El puntero al archivo binario, con un tamaño máximo de 4 GB. | No | VARCHAR(255) |
CLOB |
Objeto grande de caracteres con un tamaño de archivo máximo de 4 GB. | No | LONGTEXT |
|
BLOB |
Objeto binario grande con un tamaño máximo de 4 GB. | Sí | BLOB |
|
NCLOB |
String de Unicode de extensión variable con un tamaño de archivo máximo de 4 GB. | No | LONGTEXT |
|
ROWID | ROWID |
Dirección de fila física. | No | CHAR(n) |
UROWID(n) |
ID de fila universal de las direcciones de fila lógicas. | No | VARCHAR(n) |
|
Espaciales | SDO_GEOMETRY |
La 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 de trama o un objeto de imagen se almacena en una sola fila. | No | N/A |
|
Tipos de medios | ORDDicom |
Admite el almacenamiento y la administración de datos de audio. | No | N/A |
ORDDicom |
Admite el almacenamiento y la administración del formato Digital Imaging and Communications in Medicine (DICOM). | No | N/A |
|
ORDDoc |
Admite el almacenamiento y la administración de cualquier tipo de datos multimedia. | No | N/A |
|
ORDImage |
Admite el almacenamiento y la administración de datos de imágenes. | No | N/A |
|
ORDVideo |
Admite el almacenamiento y la administración de datos de video. | No | N/A |
Tipos definidos por el usuario
Oracle se refiere a los tipos definidos por el usuario (UDT) como OBJECT TYPES
, que se administran mediante PL/SQL. Los tipos definidos por el usuario le permiten a este crear tipos de datos complejos y dedicados a las aplicaciones que se basan en la lista de tipos de datos de Oracle incorporada y se extienden desde allí.
Este es un ejemplo de UDT de Oracle:
SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
PHONE_NUM VARCHAR2(11));
Notas de la conversión
MySQL no permite que los usuarios creen tipos dedicados y definidos.
Usuarios y tablas
En esta sección, se analiza cómo crear usuarios y asignarles permisos, y la necesidad de convertir tablas de Oracle en tablas de Cloud SQL para MySQL.
Creación de usuarios y permisos para ellos
Las cuentas de usuario de base de datos de Oracle (el “usuario” y el “esquema” de Oracle son idénticos) se pueden usar con el fin de autenticar las sesiones de base de datos y conectarse a ellas, mientras que el acceso de autorización se establece en el nivel individual de cada usuario para los objetos y permisos específicos de base de datos.
En general, hay dos tipos de usuarios de base de datos:
- Administradores: administran la instancia de la base de datos, los usuarios y los recursos.
- Cuentas de usuario: entregan operaciones lógicas, como aplicaciones.
Los administradores otorgan privilegios a las cuentas de usuario de la aplicación y del usuario para acceder a los objetos de base de datos. Los permisos de base de datos de Oracle se otorgan a un usuario para operaciones específicas (por ejemplo, con el fin de crear una sesión o conectarse) o a 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
CREATE USER
de MySQL es diferente de la de Oracle y no se puede migrar tal como está. 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 el usuario debe conectarse para acceder a la base de datos. El servidor puede ser una dirección IP específica o un DNS, o se puede conectar desde todas las fuentes mediante el signo comodín %.
- Debido a que el nombre de usuario de MySQL es una conexión de dos partes entre el nombre de usuario y el servidor desde el cual el usuario podría conectarse, se puede crear un usuario con el mismo nombre que tiene la dirección del cliente (IP/DNS) pero desde un servidor diferente.
- Una vez que se crea el usuario, se le puede otorgar permiso a los objetos de base de datos que forman parte de una base de datos o un esquema en particular.
- Los usuarios también pueden obtener permisos adicionales de acuerdo con los permisos que admite Cloud SQL para MySQL (por ejemplo, el usuario raíz tendrá todos los privilegios, excepto
SUPER
yFILE
). Los usuarios de Oracle pueden estar vinculados a un espacio de tabla dedicado mientras están en MySQL, por lo que esta función no es relevante.
Tablas
Las tablas de Oracle se construyen a partir de muchos elementos, como tipos de datos de columnas, restricciones de tablas, índices, particiones y funciones de propiedad de tablas de Oracle, entre otros. Con el objetivo de migrar de forma correcta a las tablas de base de datos de Cloud SQL para MySQL, todos los elementos de la tabla de Oracle deben convertirse en tablas de MySQL. Algunos elementos se admiten con modificaciones menores o sin ninguna modificación, mientras que otros deben modificarse por completo.
Desde la perspectiva de la migración, la conversión de PL/SQL a MySQL puede requerir más esfuerzo, ya que la conversión de tablas de Oracle en tablas de MySQL es fundamental y tiene una importancia significativa en el rendimiento y el tamaño de los datos.
A continuación, se detallan las principales diferencias entre las tablas de Oracle y MySQL y las funciones relacionadas. Estas diferencias se analizan en las otras partes de la serie.
- Distinción entre mayúsculas y minúsculas (nombres de tablas y columnas)
- Sintaxis de la creación de tablas
- Metadatos de índices y tablas
- Compatibilidad con restricciones
- Compatibilidad y limitaciones de los tipos de datos
- Índices
- Particiones y administración de particiones
- Mantenimiento de índices y tablas
- Tablas temporales
- Vistas
- Columnas invisibles y visibles (Oracle 12c)
- Grupos de caracteres de tablas y columnas