Este documento faz parte de uma série que fornece informações e orientações importantes relacionadas com o planeamento e a execução de migrações de bases de dados Oracle® 11g/12c para o Cloud SQL para MySQL versão 5.7, instâncias de segunda geração. A série inclui as seguintes partes:
- Migrar utilizadores do Oracle para o Cloud SQL para MySQL: terminologia e funcionalidade
- Migrar utilizadores do Oracle para o Cloud SQL para MySQL: tipos de dados, utilizadores e tabelas (este documento)
- Migrar utilizadores do Oracle para o Cloud SQL para MySQL: consultas, procedimentos armazenados, funções e acionadores
- Migrar utilizadores do Oracle para o Cloud SQL para MySQL: segurança, operações, monitorização e registo
Tipos de dados
O MySQL oferece vários tipos de dados totalmente equivalentes ou semelhantes aos tipos de dados fornecidos pelo Oracle. A tabela seguinte apresenta os tipos de dados do MySQL mais comuns, seguidos de uma comparação entre os tipos de dados primitivos do Oracle e os tipos de dados do MySQL correspondentes. Quando um tipo de dados não é suportado, é apresentado um tipo de dados alternativo. Tenha em atenção que uma base de dados MySQL 5.7 tem um limite de 65 535 bytes para toda a linha (consoante o conjunto de carateres usado).
Tipos de dados primitivos do MySQL 5.7
Família de tipos de dados do MySQL | Nome do tipo de dados do MySQL | Especificação do tipo de dados |
---|---|---|
String/ caráter |
CHAR(n) |
Armazena exatamente n carateres. |
VARCHAR(n) |
Armazena um número variável de carateres, até um máximo de
n carateres. |
|
BINARY |
Armazena exatamente n bytes. |
|
VARBINARY(n) |
Armazena um número variável de carateres, até um máximo de
n bytes. |
|
BLOB |
Objeto binário grande que pode conter uma quantidade variável de dados. | |
TEXT |
Variante específica de VARCHAR que não requer que especifique um limite superior para o número de carateres. |
|
ENUM |
Objeto de string com um valor escolhido a partir de uma lista de valores permitidos que são enumerados explicitamente na especificação da coluna quando a tabela é criada. | |
SET |
Objeto de string que pode ter zero ou mais valores, cada um dos quais tem de ser escolhido a partir de uma lista de valores permitidos especificados quando a tabela é criada. | |
Numérico | INT |
O valor mínimo é -2147483648 e o valor máximo é 2147483647. |
INTEGER |
O valor mínimo é -2147483648 e o valor máximo é 2147483647. | |
TINYINT |
O valor mínimo é -128 e o valor máximo é 127. | |
SMALLINT |
O valor mínimo é -32768 e o valor máximo é 32767. | |
MEDIUMINT |
O valor mínimo é -8388608 e o valor máximo é 8388607. | |
BIGINT |
O valor mínimo é -2^63 e o valor máximo é 2^63-1. | |
DECIMAL(p,s) |
Capaz de armazenar qualquer valor com p dígitos e s decimais. |
|
NUMERIC(p,s) |
Capaz de armazenar qualquer valor com p dígitos e s decimais. |
|
FLOAT(m,d) |
Os valores podem ser armazenados com um total de até m dígitos, dos quais d podem estar após o ponto decimal. |
|
DOUBLE(m,d) |
Os valores podem ser armazenados com um total de até m dígitos, dos quais d podem estar após o ponto decimal. |
|
BIT(m) |
Armazenamento de valores de m bits. m pode variar entre 1 e 64. |
|
Data e hora | DATE |
– Valores com uma parte de data, mas sem parte de hora. - Obtém e apresenta os valores DATE no formato 'YYYY-MM-DD' .- O intervalo suportado é de '1000-01-01' a
'9999-12-31' . |
DATETIME |
– Valores que contêm partes de data e hora. - Obtém e apresenta os valores DATETIME no formato 'YYYY-MM-DD HH:MM:SS' .- O intervalo suportado é de '1000-01-01 00:00:00' a
'9999- 12-31 23:59:59' . |
|
TIMESTAMP |
– Valores que contêm partes de data e hora. - TIMESTAMP tem um intervalo de '1970-01-01
00:00:01' UTC a '2038-01-19 03:14:07' UTC. |
|
TIME |
– Os valores podem variar entre '-838:59:59' e '838:59:59' .- A parte das horas pode ser tão grande porque o tipo TIME pode ser usado não só para representar uma hora do dia (que tem de ser inferior a 24 horas), mas também o tempo decorrido ou um intervalo de tempo entre dois eventos (que pode ser muito superior a 24 horas ou até negativo). |
|
YEAR |
- YEAR Tipo de 1 byte usado para representar valores de anos.- Pode ser declarado como YEAR ou
YEAR(n) e tem uma largura de apresentação de
n carateres. |
|
JSON | JSON |
Dados JSON textuais como um tipo de dados. |
Espacial (geometria) |
GEOMETRY |
O tipo de coluna a especificar quando quer usar os modelos de dados que se seguem no resto desta tabela. |
POINT |
Um valor (x,y) . |
|
LINESTRING |
Uma linha (pt1, pt2) . |
|
POLYGON |
Uma sequência de pontos, efetivamente um caminho fechado. | |
MULTIPOINT |
Coleção de valores POINT . |
|
MULTI-LINESTRING |
Coleção de valores LINE . |
|
MULTIPOLYGON |
Coleção de valores POLYGON . |
|
GEOMETRY-COLLECTION |
Recolha de tipos de dados de geometria. | |
Lógico | BOOLEAN |
– Contém um valor verdadeiro ou falso. - Aceita valores como TRUE , '1' e
1 como verdadeiros.- Usa 1 byte de armazenamento e pode armazenar NULL . |
Conversão do tipo de dados do Oracle para o MySQL
Família de tipos de dados Oracle | Nome do tipo de dados Oracle | Especificação do tipo de dados da Oracle | Equivalente do MySQL para o Oracle | MySQL correspondente/alternativo |
---|---|---|---|---|
String/ Caráter |
CHAR(n) |
Tamanho máximo de 2000 bytes. | Sim | CHAR(n) |
CHARACTER(n) |
Tamanho máximo de 2000 bytes. | Sim | CHARACTER(n) |
|
NCHAR(n) |
Tamanho máximo de 2000 bytes. | Sim | NCHAR(n) |
|
VARCHAR(n) |
Tamanho máximo de 2000 bytes. | Sim | VARCHAR(n) |
|
NCHAR VARYING(n) |
String UTF-8 de comprimento variável. Tamanho máximo de 4000 bytes. |
Sim | NCHAR VARYING(n) |
|
VARCHAR2(n) 11g |
Tamanho máximo de 4000 bytes. Tamanho máximo de 32 KB em PL/SQL. | Não | VARCHAR(n) |
|
VARCHAR2(n) 12g |
Tamanho máximo de 32 767 bytes MAX_STRING_SIZE=EXTENDED . |
Não | VARCHAR(n) |
|
NVARCHAR2(n) |
Tamanho máximo de 4000 bytes. | Não | VARCHAR(n) |
|
LONG |
O tamanho máximo é de 2 GB. | Sim | LONG |
|
RAW(n) |
Tamanho máximo de 2000 bytes. | Não | VARBINARY(n) |
|
LONG RAW |
O tamanho máximo é de 2 GB. | Não | LONGTEXT |
|
Numérico | NUMBER |
Número de vírgula flutuante. | Não | NUMERIC/DECIMAL(p,s) |
Numérico | NUMBER |
Número de vírgula flutuante. | Não | NUMERIC/DECIMAL(p,s) |
NUMBER(*) |
Número de vírgula flutuante. | Não | DOUBLE |
|
NUMERIC(p,s) |
A precisão pode variar entre 1 e 38. | Sim | NUMERIC(p,s) |
|
FLOAT(p) |
Número de vírgula flutuante. | Sim | FLOAT(p) |
|
DEC(p,s) |
Número de ponto fixo. | Sim | DEC(p,s) |
|
DECIMAL(p,s) |
Número de ponto fixo. | Sim | DECIMAL(p,s) |
|
INT |
Número inteiro de 38 dígitos. | Sim | INT |
|
INTEGER |
Número inteiro de 38 dígitos. | Sim | INTEGER |
|
SMALLINT |
Número inteiro de 38 dígitos. | Sim | SMALLINT |
|
REAL |
Número de vírgula flutuante. | Sim | REAL |
|
DOUBLE PRECISION |
Número de vírgula flutuante. | Sim | DOUBLE PRECISION |
|
Data e hora | DATE |
Armazena dados de data e hora (ano, mês, dia, hora, minuto e segundo). | Sim | DATE |
TIMESTAMP(p) |
Data e hora com fração. | Sim | TIMESTAMP |
|
TIMESTAMP(p) WITH TIME ZONE |
Data e hora com fração e fuso horário. | Não | DATETIME(n) |
|
INTERVAL YEAR(p) TO MONTH |
Intervalo de datas. | Não | VARCHAR(n) |
|
INTERVAL DAY(p) TO SECOND(s) |
Intervalo de dia e hora. | Não | VARCHAR(n) |
|
Lógico | BOOLEAN |
Valores TRUE , FALSE e NULL . Não pode ser atribuído a uma coluna de tabela de base de dados. |
Sim | BOOLEAN |
XML | XMLTYPE |
Dados XML. | Não | LONGTEXT |
LOB | BFILE |
Ponteiro para o ficheiro binário, com um tamanho máximo de 4 GB. | Não | VARCHAR(255) |
CLOB |
Objeto grande de carateres com um tamanho máximo de 4 GB. | Não | LONGTEXT |
|
BLOB |
Objeto binário grande com um tamanho máximo de 4 GB. | Sim | BLOB |
|
NCLOB |
String Unicode de comprimento variável com um tamanho máximo de ficheiro de 4 GB. | Não | LONGTEXT |
|
ROWID | ROWID |
Morada física da linha. | Não | CHAR(n) |
UROWID(n) |
ID de linha universal dos endereços de linhas lógicas. | Não | VARCHAR(n) |
|
Espacial | SDO_GEOMETRY |
A descrição geométrica de um objeto espacial. | Não | N/A |
SDO_TOPO_GEOMETRY |
Descreve uma geometria de topologia. | Não | N/A |
|
SDO_GEORASTER |
Uma grelha raster ou um objeto de imagem é armazenado numa única linha. | Não | N/A |
|
Tipos de suportes | ORDDicom |
Suporta o armazenamento e a gestão de dados de áudio. | Não | N/A |
ORDDicom |
Suporta o armazenamento e a gestão de imagens digitais e comunicações em medicina (DICOM). | Não | N/A |
|
ORDDoc |
Suporta o armazenamento e a gestão de qualquer tipo de dados multimédia. | Não | N/A |
|
ORDImage |
Suporta o armazenamento e a gestão de dados de imagens. | Não | N/A |
|
ORDVideo |
Suporta o armazenamento e a gestão de dados de vídeo. | Não | N/A |
Tipos definidos pelo utilizador
A Oracle refere-se aos tipos definidos pelo utilizador (UDTs) como OBJECT TYPES
, que são geridos
através do PL/SQL. Os tipos definidos pelo utilizador permitem que o utilizador crie tipos de dados complexos dedicados à aplicação, que se baseiam e se expandem a partir da lista de tipos de dados incorporados do Oracle.
Segue-se um exemplo da Oracle de UDT:
SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
PHONE_NUM VARCHAR2(11));
Notas de conversão
O MySQL não permite que os utilizadores criem tipos dedicados e definidos.
Utilizadores e tabelas
Esta secção aborda a criação de utilizadores e a atribuição de autorizações, bem como a necessidade de converter tabelas Oracle em tabelas do Cloud SQL para MySQL.
Criação e autorizações de utilizadores
As contas de utilizador da base de dados Oracle (o "utilizador" e o "esquema" da Oracle são idênticos) podem ser usadas para autenticar e estabelecer ligação a sessões da base de dados, enquanto o acesso de autorização é definido ao nível individual de cada utilizador para objetos e autorizações específicos da base de dados.
Em geral, existem dois tipos de utilizadores da base de dados:
- Administradores: gerir a instância da base de dados, os utilizadores e os recursos.
- Contas de utilizador: publicação de operações lógicas, como aplicações.
Os administradores concedem privilégios a contas de utilizador e de utilizador da aplicação para aceder aos objetos da base de dados. As autorizações da base de dados Oracle são concedidas a um utilizador para operações específicas (por exemplo, criar sessão/ligar) ou objetos de base de dados específicos (por exemplo, SELECT
numa tabela específica ou EXECUTE
num procedimento armazenado específico).
Considerações sobre as conversões
- A sintaxe do MySQL
CREATE USER
é diferente da do Oracle e não pode ser migrada tal como está. Além disso, ambas as bases de dados têm uma arquitetura de utilizador diferente. - Quando um administrador cria um utilizador no MySQL, tem de especificar o servidor ao qual o utilizador tem de se ligar para aceder à base de dados. O servidor pode ser um endereço IP ou um DNS específico, ou pode estabelecer ligação a partir de todas as origens através do caráter universal %
- Uma vez que o nome de utilizador do MySQL é uma associação de duas partes entre o nome de utilizador e o servidor a partir do qual o utilizador teria autorização para estabelecer ligação, é possível criar um utilizador com o mesmo nome, mas a partir de um servidor diferente do endereço do cliente (IP/DNS).
- Depois de criado, o utilizador pode receber autorização para aceder a objetos da base de dados que fazem parte de uma base de dados ou de um esquema específico.
- Também podem ser concedidas autorizações adicionais aos utilizadores de acordo com as
autorizações permitidas do Cloud SQL para MySQL
(por exemplo, o utilizador root tem todos os privilégios, exceto os privilégios
SUPER
eFILE
). Os utilizadores do Oracle podem ser anexados a um tablespace dedicado, enquanto no MySQL, esta funcionalidade não é relevante.
Tabelas
As tabelas Oracle são criadas a partir de muitos elementos, como tipos de dados de colunas, restrições de tabelas, índices, partições, funcionalidades proprietárias de tabelas Oracle e muito mais. Para migrar com êxito para tabelas da base de dados do Cloud SQL para MySQL, todos os elementos das tabelas do Oracle têm de ser convertidos em tabelas do MySQL. Alguns elementos são suportados sem modificações ou com modificações menores, enquanto outros têm de ser modificados completamente.
Do ponto de vista da migração, a conversão de PL/SQL em MySQL requer provavelmente mais esforço, uma vez que a conversão de tabelas Oracle em tabelas MySQL é uma fase crucial com importância significativa e implicações adicionais no desempenho e no tamanho dos dados.
Seguem-se as principais diferenças entre as tabelas Oracle e MySQL, e as funcionalidades relacionadas. Estas diferenças são abordadas nas restantes partes da série.
- Sensibilidade a maiúsculas e minúsculas (nomes de tabelas e colunas)
- Sintaxe de criação de tabelas
- Metadados de tabelas e índices
- Compatibilidade com restrições
- Suporte e limitações de tipos de dados
- Índices
- Partições e gestão de partições
- Manutenção de tabelas e índices
- Tabelas temporárias
- Visualizações
- Colunas visíveis e invisíveis (Oracle 12c)
- Conjuntos de carateres de tabelas e colunas