Este documento faz parte de uma série que fornece informações importantes e orientações relacionadas ao planejamento e à execução de migrações de banco 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 partes a seguir:
- Como migrar usuários do Oracle para o Cloud SQL para MySQL: terminologia e funcionalidade
- Como migrar usuários do Oracle para o Cloud SQL para MySQL: tipos de dados, usuários e tabelas (este documento)
- Como migrar usuários do Oracle para o Cloud SQL para MySQL: consultas, procedimentos armazenados, funções e gatilhos
- Como migrar usuários da Oracle para o Cloud SQL para MySQL: segurança, operações, monitoramento e geração de registros
Tipos de dados
O MySQL fornece vários tipos de dados que são totalmente equivalentes ou semelhantes aos tipos de dados fornecidos pela Oracle. Na tabela a seguir, listamos os tipos de dados MySQL mais comuns, seguidos por uma comparação entre os tipos de dados primários do Oracle e os tipos de dados MySQL correspondentes. Quando um tipo de dados não é compatível, um tipo alternativo é listado. Um banco de dados MySQL 5.7 tem um limite de 65.535 bytes para toda a linha (dependendo do conjunto de caracteres usado).
Tipos de dados primários do MySQL 5.7
Família de tipos de dados MySQL | Nome do tipo de dados MySQL | Especificação do tipo de dados |
---|---|---|
String/ caractere |
CHAR(n) |
Armazena exatamente n caracteres. |
VARCHAR(n) |
Armazena um número variável de caracteres, até um máximo de n caracteres. |
|
BINARY |
Armazena exatamente n bytes. |
|
VARBINARY(n) |
Armazena um número variável de caracteres, até um máximo de n bytes. |
|
BLOB |
Objeto grande binário que pode conter uma quantidade variável de dados. | |
TEXT |
Variante específica de VARCHAR que não exige um limite máximo para o número de caracteres. |
|
ENUM |
Objeto de string com um valor escolhido em 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 deles precisa ser escolhido em uma lista de valores permitidos especificados quando a tabela é criada. | |
Numérico | INT |
O valor mínimo é de - 1414484848 | O valor máximo é 2147483647. |
INTEGER |
O valor mínimo é de - 1414484848 | O valor máximo é 2147483647. | |
TINYINT |
O valor mínimo é -128 | O valor máximo é 127. | |
SMALLINT |
O valor mínimo é -32768 | O valor máximo é 32767. | |
MEDIUMINT |
O valor mínimo é -8388608 | O valor máximo é 8388607. | |
BIGINT |
O valor mínimo é de 2^63 | 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 até m dígitos no total, dos quais d dígitos podem estar após o ponto decimal. |
|
DOUBLE(m,d) |
Os valores podem ser armazenados com até m dígitos no total, dos quais d dígitos podem estar após o ponto decimal. |
|
BIT(m) |
Armazenamento de valores de m bits. m pode alcançar de 1 a 10. |
|
Data e hora | DATE |
- valores com uma parte da data, mas sem parte da hora. - recupera e exibe valores DATE no formato 'YYYY-MM-DD' .- o intervalo compatível é de '1000-01-01' a '9999-12-31' . |
DATETIME |
- valores que contêm partes de data e hora. - recupera e exibe valores DATETIME no formato 'YYYY-MM-DD HH:MM:SS' .- o intervalo compatível é 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 de '-838:59:59' a '838:59:59' .- a parte do horário pode ser muito grande, porque o tipo TIME pode ser usado não apenas para representar uma hora do dia (que precisa ser menor que 24 horas), mas também um tempo decorrido ou um intervalo de tempo entre dois eventos (que podem ser muito maiores que 24 horas ou até mesmo negativos). |
|
YEAR |
- YEAR tipo de 1 byte usado para representar valores de ano.- pode ser declarado como YEAR ou YEAR(n) e tem uma largura de exibição de n caracteres. |
|
JSON | JSON |
Dados JSON textuais como um tipo de dados. |
Espacial (geometria) |
GEOMETRY |
O tipo de coluna a ser especificado quando você quer usar os modelos de dados que seguem no restante desta tabela. |
POINT |
Um valor (x,y) . |
|
LINESTRING |
Uma linha (pt1, pt2) . |
|
POLYGON |
Uma sequência de pontos, efetivamente um caminho fechado. | |
MULTIPOINT |
Conjunto de valores POINT . |
|
MULTI-LINESTRING |
Conjunto de valores LINE . |
|
MULTIPOLYGON |
Conjunto de valores POLYGON . |
|
GEOMETRY-COLLECTION |
Conjunto de tipos de dados de geometria. | |
Lógica | 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 Oracle para MySQL
Família de tipos de dados do Oracle | Nome do tipo de dados do Oracle | Especificação do tipo de dados do Oracle | Equivalente do MySQL para o Oracle | Correspondente/alternativa do MySQL |
---|---|---|---|---|
String/ caractere |
CHAR(n) |
Tamanho máximo de 2.000 bytes. | Sim | CHAR(n) |
CHARACTER(n) |
Tamanho máximo de 2.000 bytes. | Sim | CHARACTER(n) |
|
NCHAR(n) |
Tamanho máximo de 2.000 bytes. | Sim | NCHAR(n) |
|
VARCHAR(n) |
Tamanho máximo de 2.000 bytes. | Sim | VARCHAR(n) |
|
NCHAR VARYING(n) |
String UTF-8 de comprimento variável de 4.000 bytes. |
Sim | NCHAR VARYING(n) |
|
VARCHAR2(n) 11g |
Tamanho máximo de 4.000 bytes. Tamanho máximo de 32 KB em PL/SQL. | Não | VARCHAR(n) |
|
VARCHAR2(n) 12g |
Tamanho máximo de 32767 bytes MAX_STRING_SIZE=EXTENDED . |
Não | VARCHAR(n) |
|
NVARCHAR2(n) |
Tamanho máximo de 4.000 bytes. | Não | VARCHAR(n) |
|
LONG |
Tamanho máximo de 2 GB. | Sim | LONG |
|
RAW(n) |
Tamanho máximo de 2.000 bytes. | Não | VARBINARY(n) |
|
LONG RAW |
Tamanho máximo de 2 GB. | Não | LONGTEXT |
|
Numérico | NUMBER |
Número de ponto flutuante. | Não | NUMERIC/DECIMAL(p,s) |
Numérico | NUMBER |
Número de ponto flutuante. | Não | NUMERIC/DECIMAL(p,s) |
NUMBER(*) |
Número de ponto flutuante. | Não | DOUBLE |
|
NUMERIC(p,s) |
A precisão pode variar de 1 a 38. | Sim | NUMERIC(p,s) |
|
FLOAT(p) |
Número de ponto 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 ponto flutuante. | Sim | REAL |
|
DOUBLE PRECISION |
Número de ponto 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 data. | Não | VARCHAR(n) |
|
INTERVAL DAY(p) TO SECOND(s) |
Intervalo de dia e hora. | Não | VARCHAR(n) |
|
Lógica | BOOLEAN |
Valores TRUE , FALSE e NULL . Não é possível atribuir uma coluna de tabela de banco de dados. |
Sim | BOOLEAN |
XML | XMLTYPE |
Dados XML. | Não | LONGTEXT |
LOB | BFILE |
Ponteiro para arquivo binário, com tamanho máximo de 4 GB. | Não | VARCHAR(255) |
CLOB |
Objeto grande de caractere com tamanho máximo de arquivo de 4 GB. | Não | LONGTEXT |
|
BLOB |
Objeto grande binário com tamanho máximo de 4 GB. | Sim | BLOB |
|
NCLOB |
String Unicode de comprimento variável com tamanho máximo de arquivo de 4 GB. | Não | LONGTEXT |
|
ROWID | ROWID |
Endereço da linha física. | Não | CHAR(n) |
UROWID(n) |
ID de linha universal dos endereços de linha lógicos. | 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 grade de varredura ou um objeto de imagem é armazenado em uma única linha. | Não | N/A |
|
Tipos de mídia | ORDDicom |
Compatível com armazenamento e gerenciamento de dados de áudio. | Não | N/A |
ORDDicom |
Compatível com o armazenamento e o gerenciamento de imagens e comunicações digitais em medicina (DICOM, na sigla em inglês). | Não | N/A |
|
ORDDoc |
Compatível com armazenamento e gerenciamento de qualquer tipo de dados de mídia. | Não | N/A |
|
ORDImage |
Compatível com o armazenamento e o gerenciamento de dados de imagem. | Não | N/A |
|
ORDVideo |
Compatível com armazenamento e gerenciamento de dados de vídeo. | Não | N/A |
Tipos definidos pelo usuário
A Oracle se refere a tipos definidos pelo usuário (UDTs, na sigla em inglês) como OBJECT TYPES
, que são gerenciados usando PL/SQL. Eses tipos permitem que o usuário crie tipos de dados complexos e dedicados a aplicativos baseados na lista de tipos de dados integrados do Oracle.
Veja um exemplo de UDT do Oracle:
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 usuários criem tipos dedicados e definidos.
Usuários e tabelas
Nesta seção, tratamos de como criar usuários e atribuir permissões a eles, além da necessidade de converter tabelas do Oracle em tabelas do Cloud SQL para MySQL.
Criação e permissões de usuários
As contas de usuário do banco de dados Oracle ("user" e "schema" da Oracle são idênticos) podem ser usadas para autenticação e conexão com sessões de banco de dados, enquanto o acesso de autorização é definido no nível individual de cada usuário para permissões e objetos de banco de dados específicos.
Em geral, há dois tipos de usuários de banco de dados:
- Administradores: gerenciar a instância, os usuários e os recursos do banco de dados.
- Contas de usuário: disponibilizar operações lógicas, como aplicativos.
Os administradores concedem privilégios a contas de usuário e de aplicativo para acessar os objetos do banco de dados. As permissões do banco de dados Oracle são concedidas a um usuário para operações específicas (por exemplo, criar sessão/conexão) ou objetos de banco de dados específicos (por exemplo, SELECT
em uma tabela específica ou EXECUTE
em um procedimento armazenado específico).
Considerações sobre conversão
- A sintaxe
CREATE USER
do MySQL é diferente da do Oracle e não pode ser migrada no estado atual. Além disso, os dois bancos de dados têm arquitetura de usuário diferente. - Quando um administrador cria um usuário no MySQL, ele precisa especificar o servidor ao qual o usuário precisa se conectar para acessar o banco de dados. O servidor pode ser um endereço IP ou DNS específico ou pode se conectar de todas as fontes usando o caractere curinga %.
- Como o nome de usuário do MySQL é um anexo de duas partes entre o nome de usuário e o servidor a partir do qual o usuário poderia se conectar, um usuário pode ser criado com o mesmo nome, mas a partir de um servidor diferente do endereço do cliente (IP/DNS).
- Depois que o usuário é criado, ele pode receber permissão para objetos de banco de dados que fazem parte de um banco de dados ou esquema específico.
- Os usuários também podem receber outras permissões de acordo com Permissões do Cloud SQL para MySQL. Por exemplo, o usuário raiz terá todos os privilégios, exceto
SUPER
eFILE
. Os usuários da Oracle podem ser anexados a um espaço de tabela dedicado no MySQL. Portanto, essa funcionalidade não é relevante.
Tabelas
As tabelas Oracle são construídas com base em muitos elementos, como tipos de dados de coluna, restrições de tabela, índices, partições, recursos reservados de tabelas Oracle e muito mais. Para migrar com sucesso para as tabelas de banco de dados do Cloud SQL para MySQL, todos os elementos da tabela Oracle precisam ser convertidos em tabelas MySQL. Alguns elementos são compatíveis sem nenhuma modificação, outros sofrem pequenas modificações e outros precisam ser completamente modificados.
Do ponto de vista da migração, a conversão de PL/SQL em MySQL provavelmente requer mais esforço, porque converter tabelas da Oracle em tabelas do MySQL é uma etapa essencial com importância significativa e outras implicações no desempenho e no tamanho dos dados.
Veja a seguir as principais diferenças entre as tabelas Oracle e MySQL e os recursos relacionados. Essas diferenças são discutidas nas partes restantes da série.
- Diferenciação entre maiúsculas e minúsculas (nomes de tabelas e colunas)
- Criar sintaxe de tabela
- Metadados de tabela e índice
- Suporte a restrições
- Compatibilidade e limitações de tipos de dados
- Índices
- Partições e gerenciamento de partições
- Gerenciamento de tabelas e índices
- Tabelas temporárias
- Visualizações
- Colunas visíveis e invisíveis (Oracle 12c)
- Conjuntos de caracteres de tabela e coluna