You are on page 1of 16

Introduction

Até Abril de 2004, mais de 4 milhões de instalações. Hoje, provavelmente, mais de 6 milhões.

Em 2002 havia 2 exames. Há 2 níveis de certificações: Developer (CMDEV) e Database Administrator


(CMDBA), com 2 exames cada um deles. 40% a 50% falham no exame a 1ª vez.

Cada exame tem uma duração de 90 minutos, com um total de 70 questões.

Muitas declarações finalizam com “;”. É particularmente útil nas declarações com muitas linhas. Não faz
parte da declaração.

About the Exams

Interpreting DESCRIBE Output


DESCRIBE City: Exibe a estrutura da tabela CITY.

mysql> DESCRIBE City;


+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+

 O valor Field indica o nome da coluna.


 O valor Type mostra o tipo de dados da coluna.
 O indicador NULL será YES se a coluna pode conter valores NULL e NO caso contrário. No exemplo
mostrado, Null é NO para todas as colunas da tabela City. Isso indica que todas as colunas da tabela não
podem conter valores NULL.
 O indicador Key pode ter um dos quatro valores:
1. Um valor vazio para Key indica que a coluna em questão não está indexada ou está indexada
apenas como uma coluna secundária em uma multi-coluna, índice não-exclusivo. Para efeitos do
exame, você deve assumir que se a chave está vazia, é porque a coluna não é indexada.
2. Se o valor é a palavra-chave PRI (como mostrado na saída para a coluna ID), isso indica que a
coluna é uma PRIMARY KEY ou é uma das colunas em uma indexação multi-coluna PRIMARY KEY.
3. Se o valor é a palavra-chave UNI, isso indica que é a primeira coluna de um índice não-único ou
um índice de valor único que não pode conter valores NULL.
4. Se o valor é a palavra-chave MUL, isso indica que a coluna é a primeira coluna de um índice não-
exclusivo ou um índice de valor exclusivo que pode conter valores NULL.

É possível que mais do que um dos valores para Key possam ser aplicados a uma determinada coluna
de uma tabela. Por exemplo, uma coluna que é uma PRIMARY KEY também pode ser parte de outros
índices. Quando é possível mais do que um valor para descrever o índice Key, DESCRIBE mostra o que
tem a prioridade mais elevada, na ordem PRI, UNI, MUL.
Porque uma coluna pode fazer parte de vários índices, os valores de Key nem sempre fornecem uma
descrição exaustiva dos índices de uma tabela. No entanto, para fins de exame, você deve assumir
que a descrição dada da tabela fornece todas as informações necessárias para responder
correctamente.

 Default mostra o valor padrão da coluna. Este é o valor que o MySQL atribui à coluna quando uma
instrução para criar um novo registo não fornece um valor explícito para a coluna. (Por exemplo, isso
pode acontecer com os comandos INSERT, REPLACE, e LOAD DATA INFILE).
 O valor Extra exibe outros detalhes sobre a coluna. O valor que nos interessa para o exame é o
AUTO_INCREMENT.

Sample Tables
C:\> mysql --user=root --password=sa

1. mysql> CREATE DATABASE world;


2. mysql> USE world;

3. mysql> SOURCE world.sql;

4. mysql> SHOW TABLES;

C:\> mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.5\my.ini"

A base de dados WORLD contém 3 tabelas: Country, City e CountryLanguage.

mysql> DESCRIBE Country;


+----------------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------------+------+-----+---------+-------+
| Code | char(3) | NO | PRI | | |
| Name | char(52) | NO | | | |
| Continent | enum(‘Asia’, ...) | NO | | Asia | |
| Region | char(26) | NO | | | |
| SurfaceArea | float(10,2) | NO | | 0.00 | |
| IndepYear | smallint(6) | YES | | NULL | |
| Population | int(11) | NO | | 0 | |
| LifeExpectancy | float(3,1) | YES | | NULL | |
| GNP | float(10,2) | YES | | NULL | |
| GNPOld | float(10,2) | YES | | NULL | |
| LocalName | char(45) | NO | | | |
| GovernmentForm | char(45) | NO | | | |
| HeadOfState | char(60) | YES | | NULL | |
| Capital | int(11) | YES | | NULL | |
| Code2 | char(2) | NO | | | |
+----------------+-------------------+------+-----+---------+-------+

(“GNP” significa “gross national product).”

O campo Continent, na realidade, seria o seguinte: enum ('Asia', 'Europe', 'North America’, ’Africa’,
‘Oceania’, ‘Antarctica", "South America’).
mysql> DESCRIBE City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+

O campo Name contém os nomes completos dos países. Cada país possui um campo CountryCode
composto por 3 letras que representa uma abreviatura.

mysql> DESCRIBE CountryLanguage;


+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3) | NO | PRI | | |
| Language | char(30) | NO | PRI | | |
| IsOfficial | enum(‘T’,’F’) | NO | | F | |
| Percentage | float(4,1) | NO | | 0.0 | |
+-------------+---------------+------+-----+---------+-------+
Na tabela CountryLanguage note que cada país pode ter mais do que uma língua associada. Por exemplo,
na Finlândia podemos falar Finlandês, Sueco e outras línguas. Por esta razão, CountryLanguage possui uma
indexação composta por múltiplas colunas, nomeadamente Country e CountryLanguage.

Client/Server Concepts
1.1 General MySQL Architecture
MySQL opera em um ambiente de rede usando uma arquitectura cliente / servidor. Em outras palavras, um
programa actua como um servidor central, e vários programas cliente se conectam para fazer solicitações.
A instalação do MySQL tem os seguintes componentes principais:

 MySQL Server, ou mysqld, é o programa do servidor da base de dados. O servidor gere o acesso às bases
de dados reais no disco e na memória. O MySQL Server é multi-threaded e suporta muitas conexões
simultâneas de clientes. Os clientes podem se conectar através da de vários protocolos. Para gerir o
conteúdo da base de dados, o MySQL Server possui uma arquitectura modular que suporta múltiplos
mecanismos de armazenamento que manipulam diferentes tipos de tabelas (por exemplo, trabalha tanto
com tabelas transaccionais como não transaccionais). O mysqld vem em várias configurações.
Distribuições MySQL Max contem um servidor chamado mysqld-max, que inclui funcionalidades que não
são incorporadas à versão non-Max, como suporte para os motores de armazenamento adicional. No
Windows, o mysqld-nt e servidores mysql-max-nt fornecem suporte para conexões named pipes no
Windows NT, 2000, XP e 2003. Se uma determinada instalação inclui vários programas de servidores,
escolhe-se um para ser executado entre os disponíveis. A configuração exacta dos recursos do MySQL
podem mudar ao longo do tempo, por isso sempre que actualizar para uma nova versão, é aconselhável
verificar a documentação. Tenha em mente a diferença entre um Server e um Host. O servidor é um
software (programa mysqld do servidor MySQL). As características do servidor incluem o número da
versão, se certas funcionalidades são incluídas ou excluídas, e assim por diante. O host é a máquina física
em que o programa servidor é executado. As características do host incluem a sua configuração de
hardware, o sistema operativo em execução na máquina, seus endereços de rede, e assim por diante.
 Os programas cliente. Estes são os programas que você usa para se comunicar com o servidor e
manipular as informações nas bases de dados que o servidor gere. MySQL AB oferece vários programas
cliente. A lista a seguir descreve alguns deles:
1. MySQL Query Browser e o MySQL Administrator são interfaces gráficas front-end para o
servidor.
2. mysql é um programa de linha de comando que funciona como um front-end baseado em texto
para o servidor. É utilizado para a emissão de consultas e exibir os resultados de forma interactiva a
partir de uma janela de terminal.
3. Outros clientes de linha de comando incluem mysqlimport para importação de ficheiros de
dados, mysqldump para fazer backups, mysqladmin para administração de servidores, e
mysqlcheck para verificar a integridade dos ficheiros de base de dados.
 Utilitários MySQL não-clientes. São programas que actuam de forma independente do servidor. Eles não
funcionam antes de estabelecer uma conexão com o servidor. myisamchk é um exemplo. Ele executa
operações de verificações e reparações das tabelas. Outro programa nesta categoria é myisampack, que
cria versões compactadas somente de leitura de tabelas MyISAM. Ambos utilitários funcionam acedendo
directamente aos ficheiros das tabelas MyISAM, independente da base de dados do servidor mysqld.

--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---

MySQL — MyISAM versus InnoDB

MyISAM — Muito rápido. Motor baseado no armazenamento em disco sem suporte para transacções.
Oferece busca de texto completo, chaves empacotadas e é o motor de armazenamento padrão.
InnoDB — Transacção segura. Motor baseado no armazenamento em disco com bloqueio de linhas.
Recomendado para tabelas que necessitam suporte a transacções.

E agora? Qual deles escolher?


Existem diversos formatos de armazenamento de tabelas no MySQL, porém, os mais populares
actualmente são o MyISAM (padrão por omissão) e o InnoDB. Mas, fora a questão das transacções, onde é
imprescindível o suporte as mesmas, qual dos dois escolher?
Como já disseram: “MyISAM está para ext3fs tal como InnoDB está para reiser3fs”. Motivo? ext3fs é mais
rápido, porém em caso de pane ou travamento, as tabelas podem corromper-se com relativa facilidade. Já
o InnoDB é mais lento pois armazena os dados directamente no disco, não os deixando em cache de escrita
na RAM. Mais lento, porém proporcionalmente mais seguro.
E como converter uma tabela de MyISAM para InnoDB ou vice-versa? A forma mais fácil e indolor é fazê-lo
usando uma ferramenta gráfica chamada MySQL Administrator. É possível fazer a conversão pela interface
via console
Detalhe: se o hardware é fiável e o sistema possui requisitos para “alta disponibilidade”, não há grandes
problemas em usar o formato MyISAM, muito pelo contrário, principalmente se o volume de dados for
grande. Sempre lembrando que MyISAM não suporta transacções…

--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---

--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
O MySQL possui uma característica um pouco diferente dos outros sistemas gerenciadores de base de
dados, uma vez que no MySQL é possível escolher o tipo da tabela no momento da criação da mesma. O
formato de armazenamento dos dados, bem como alguns recursos da base de dados são dependentes do
tipo de tabela escolhido.
A definição do tipo de tabela é feito através do comando CREATE TABLE, como mostrado a seguir:

CREATE TABLE teste ( id INT NOT NULL, texto CHAR(30) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;

No comando acima, TYPE=MyISAM, indica que a tabela criada será do tipo MyISAM, que é o valor default
caso não seja informado o TYPE. A partir da versão 4.0.18 você pode utilizar ENGINE como sinónimo de
TYPE. A seguir estão apresentados os tipos de tabelas existentes no MySQL:

1. MyISAM:
Este é o tipo de tabela padrão do MySQL. Caso não seja informado o tipo de tabela, o MySQL criará a tabela
do tipo MyISAM. O tipo de tabela default pode ser alterado incluindo-se no arquivo de configuração, a
opção descrita a seguir: default-table-type=tipo.
As tabelas MyISAM são armazenadas em 3 ficheiros: .FRM que armazena a definição da tabela, o ficheiro
.MYD que contém os dados e o .MYI contendo os índices. Estas tabelas são de grande desempenho para
leitura, uma vez que os seus índices são armazenados em árvores binárias balanceadas, o que provê um
ganho para o acesso às informações. O MyISAM não provê controlo de transacções (commit ou rollback) e
também não possui integridade referencial, isto é, ao incluir uma chave estrangeira com alguns constraints,
esta servirá apenas como documentação, mas as restrições não serão respeitadas pela base de dados.
Como as tabelas MyISAM são representadas por três ficheiros no modelo, existe, em alguns sistemas
operativos, restrições quanto ao tamanho destas tabelas. No Linux, por exemplo, existe a restrição de
2G/4GB por ficheiros. Com isto, uma tabela MyISAM poderia ter somente 2G/4GB de dados. Para superar
esta limitação foi introduzido na versão 4.1 a opção RAID_TYPE utilizada no CREATE TABLE, que permite ao
próprio MySQL dividir o armazenamento da tabela em vários ficheiros. Com isto, o tamanho da tabela
MyISAM não fica preso ao tamanho máximo de ficheiros do sistema operativo. O principal problema
encontrado com as tabelas MyISAM é que elas possuem um mecanismo de locks por tabela. Assim, todas
as vezes que há uma escrita na tabela, o MySQL precisa travar a tabela como um todo, o que bloqueia por
um instante o acesso à esta tabela, mesmo para processos que tentem aceder registos que estão sendo
modificados. Assim, é gerada uma fila de espera até que o lock seja liberado e os outros processos possam
ser executados. Por outro lado, estas tabelas são extremamente rápidas, devido à sua arquitetura
simplificada.

2. HEAP:
Tabelas HEAP são armazenadas em memória e por isto são extramente rápidas. Por outro lado o seu
conteúdo é volátil, uma vez que não são gravadas em disco. Caso haja uma queda do SGBD os dados destas
tabelas serão perdidos. Além disto, é necessário um processo para dar a carga inicial nos dados quando o
servidor de base de dados iniciar a sua execução. A principal aplicação das tabelas HEAP seria para tabelas
que são consultadas com muita frequência, mas que não sofrem muitas alterações (lookup tables).

3. MERGE:
As tabelas MERGE são colecções de tabelas MyISAM idênticas. Este recurso permite a divisão de uma
tabela grande em várias partes menores, e ainda assim permite acesso ao conteúdo de todas elas como se
fossem uma única tabela. O exemplo a seguir ilustra a criação de uma tabela MERGE:

CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20) );
CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20) );
INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1'); INSERT INTO t2 (message) VALUES ('Testing'),
('table'),('t2');
CREATE TABLE total ( a INT NOT NULL AUTO_INCREMENT, message CHAR(20), INDEX(a) )TYPE=MERGE
UNION=(t1,t2);
SELECT * FROM total;

a message

1 Testing

2 table

3 t1

1 Testing

2 table

3 t2

Percebam que as tabelas t1, t2 e total são idênticas e as duas primeiras são tabelas MyISAM (foi omitido o
TYPE no comando CREATE TABLE). Ao se submeter um SELECT na tabela total, você tem acesso ao
conteúdo das tabelas t1 e t2, simultaneamente. A principal vantagem da tabela MERGE é permitir a divisão
de tabelas grandes em tabelas pequenas, mais facilmente gerenciadas. Também permite superar as
limitações do sistema operativo em relação ao tamanho dos ficheiros, uma vez que a tabela seria dividida
em várias partes, onde cada parte poderia atingir o tamanho máximo de ficheiro. A desvantagem é que
podemos fazer apenas MERGE de tabelas MyISAM idênticas.

4. BDB:
O tipo de tabela BDB vem de BerkeleyDB, e é desenvolvido pela Sleepycat (http://www.sleepycat.com). O
BDB provê ao MySQL um manipulador de tabelas com controlo de transacção, isto é, você poderá utilizar
os comandos COMMIT e ROLLBACK, além de fornecer a recuperação automática de dados em caso de
queda do sistema. O BDB apresenta um mecanismo de lock em nível de página, onde apenas os dados de
uma mesma página ficarão bloqueados durante um perído de lock. Além disto, você poderá ter vários locks
activos numa única tabela BDB, uma vez que a tabela poderá ser constituída de várias páginas.

5. InnoDB:
O InnoDB é um tipo de tabela transaccional, desenvolvido pela InnoDBase Oy. A partir da versão 4.0 do
MySQL ele passa a ser parte integrada das distribuições do MySQL. O InnoDB apresenta, além da
capacidade transaccional, outros recursos importantes:
 Integridade referencial, com implementação dos constraints SET NULL, SET DEFAULT,
RESTRICT e CASCADE;
 Ferramenta de backup on-line (ferramenta comercial, não GPL);
 Lock de registo, como Oracle, DB2, etc;
 Níveis de isolamento;
 Armazenamentos de dados em tablespace.

Por se tratar de um tipo de tabela com recursos mais avançados, requer mais espaço em
memória e disco, além de se apresentar, em determinadas situações, um pouco mais lento
que MyISAM. Apesar disto, o InnoDB tem se mostrado extremamente rápido se comparado
com outros SGBDs transaccionais.

A vantagem da utilização de tipos de tabela é que você poderá optar por utilizar um
determinado tipo ou outro dependendo dos requisitos exigidos pela sua aplicação. Por
exemplo, se a sua aplicação é apenas de consulta você pode optar pelo tipo MyISAM em vez
do InnoDB, com isto evita o overhead da transacção, obtendo um maior desempenho. É
importante lembrar que poderá utilizar vários tipos de tabelas em uma mesma base de dados.
Neste caso, deve-se tomar cuidado com a utilização de determinados recursos, por exemplo,
se tiver uma transacção envolvendo tabelas InnoDB e MyISAM e submeter um comando
ROLLBACK, apenas os comandos executados no InnoDB serão desfeitos, enquanto que os
comandos executados no MyISAM persistirão. A utilização do tipo de tabela correcto é um
factor chave para determinar o desempenho da sua aplicação.

--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---

MySQL roda em computadores com sistemas operativos diferentes. Os programas cliente podem conectar-
se ao servidor na mesma máquina como em máquinas diferentes, e não precisam estar com os mesmos
sistemas operativos.

1.2 Invoking Client Programs


Os programas cliente do MySQL podem ser invocados a partir da linha de comandos, tanto em Windows
como em Linux, existindo a possibilidade de passar parâmetros que indicam a forma como a conexão à
base de dados deve ser feita, bem como as acções que devem ser realizadas pelo programa.
Também podem ser especificados parâmetros de conexão para programas cliente gráficos, como o MySQL
Query Browser e o MySQL Administrator.

shell> mysql --help

shell> mysql --version

1.2.1 General Command Option Syntax


Existem 2 maneiras de passer parametros: opções Longas e Curtas.

shell> mysql --version


shell> mysql -V

shell> mysql --host=myhost.example.com


shell> mysql -h myhost.example.com
shell> mysql -hmyhost.example.com

1.2.2 Connection Parameter Options


Table 1.1 Options for Establishing a Connection
Option Meaning
--protocol The protocol to use for the connection
--host The host where the server is running
--port The port number for TCP/IP connections
--shared-memory-base-name The shared-memory name for shared-memory connections
--socket The Unix socket filename or named-pipe name

Table 1.2 Options for MySQL User Identification


Option Meaning
--user The MySQL account username
--password The MySQL account password
Protocol
--protocol Value Connection Protocol Allowable Operating Systems
tcp TCP/IP connection to local All
or remote server
socket Unix socket file connection Unix only
to local server
pipe Named-pipe connection to Windows only
local server
memory Shared-memory connection to Windows only
local server

--host=host_name or -h host_name
Esta opção especifica a máquina onde o servidor MySQL está a ser executado. O valor pode ser um nome
ou um número IP. O localhost significa que o host é o computador local (ou seja, o computador no qual está
a ser executado o programa de cliente). No Unix, o localhost é tratado de forma especial. No Windows, o
valor “.” (ponto) também define o local host e é tratado de forma especial também. O valor da máquina
padrão é localhost.

--port=port_number or -P port_number
Esta opção indica o número da porta à qual se conectar no servidor hospedeiro. Ela se aplica apenas para
conexões TCP / IP. O número padrão da porta do MySQL é 3306.

--shared-memory-base-name=memory_name
Esta opção pode ser usada no Windows para especificar o nome da memória partilhada a ser usada em
uma conexão ao servidor local. O nome padrão de memória partilhada é MySQL (case sensitive).

--socket=socket_name or -S socket_name
Este nome da opção vem de seu uso original para especificar um ficheiro de soquete do domínio Unix. No
Unix, para uma conexão com o host localhost, um cliente se conecta ao servidor utilizando um ficheiro de
socket Unix. Esta opção especifica o caminho desse ficheiro. No Windows, a opção --socket é usada para
especificar um pipe nomeado. Para sistemas baseados no Windows-NT que suportam pipes nomeados, um
cliente pode conectar-se usando um pipe especificando “.” como nome da máquina. Neste caso, --socket
especifica o nome do pipe. Os nomes dos pipes não são case sensitive. Se esta opção for omitida, o padrão
para o caminho do ficheiro em Unix é /tmp/mysql.sock. O nome padrão do pipe em Windows é MySQL.

Como mencionado anteriormente, se a opção --protocol não é dada, o protocolo de conexão é


determinado implicitamente, com base no nome do servidor e o sistema operativo do cliente:

- Em Windows, um cliente pode estabelecer uma conexão de pipe nomeado para o servidor local,
especificando “.” como nome da máquina.
- Em Unix, o localhost é especial para o MySQL: Indica que o cliente deve se conectar ao servidor usando
um ficheiro de socket Unix. Neste caso, qualquer número de porta especificado com a opção --port é
ignorado.
- Para estabelecer explicitamente uma conexão TCP / IP para um servidor local, --protocol=tcp ou então
especificar um host 127.0.0.1 (o endereço da interface de loopback TCP/IP) ou o hostname ou IP actual do
servidor.

Existem duas opções para fornecer informações de identificação. Elas indicam o nome de utilizador e
palavra passe da conta que deseja usar para aceder ao servidor. O servidor rejeita as tentativas de conexão
a menos que sejam fornecidos valores para esses parâmetros que correspondam a uma conta MySQL que
está listada nas tabelas de privilégios do servidor.
--user=user_name or -u user_name
Esta opção especifica o nome de utilizador da conta MySQL. Para determinar qual conta aplicar, o servidor
usa o valor de nome em conjunto com o nome do servidor. Isto significa que pode haver diferentes contas
com o mesmo nome, que podem ser usadas para conexões a diferentes hosts. No Windows, o nome da
conta padrão do MySQL é ODBC. No Unix, os programas cliente usam seu nome de login do sistema como o
seu nome de usuário padrão do MySQL.

--password=pass_value or -ppass_value
Esta opção especifica a senha da conta MySQL. Não há senha padrão. Se omitir esta opção, a conta do
MySQL deve ser configurada para permitir conexões sem senha.

- Pode-se omitir o valor da senha após a opção. Isso difere de outras opções de parâmetros de conexão,
cada um dos quais exige um valor depois do nome da opção. Se omitir o valor da senha, o programa cliente
solicita a você interactivamente uma senha, como mostrado aqui:

Shell> mysql-p
Digite a senha:

Quando é exibido o prompt “Enter password:”, digite a senha e pressione Enter. A senha não é exibida
enquanto é digitada, para evitar que outras pessoas a vejam.

- Se utilizar a forma abreviada da opção de senha (-p) e dar o valor da senha na linha de comando, não deve
haver nenhum espaço entre o -p e o valor. Isto é, -ppass_val está correto, mas –p pass_val não é. Isso difere
da forma curta para outros opções de parâmetros de conexão, onde um espaço é permitido entre a opção
e a seu valor. (Por exemplo, -hhost_name e -h host_name são válidos.) Esta excepcional exigência de que
não haja espaço entre -p e o valor da senha é uma lógica necessária para permitir que o parâmetro de
opção seja omitido.

Se tiver uma senha especificada na opção do ficheiro, mas deseja conectar usando uma conta que não tem
senha, especificar -p ou --password na linha de comando sem uma senha e pressione Enter no prompt
Enter password:
Outra opção que afecta a conexão entre o cliente e o servidor é –compress (ou -C). Esta opção faz com que
os dados enviados entre o cliente e o servidor sejam compactados antes da transmissão e descompactados
após o recebimento. O resultado é uma redução no número de bytes enviados através da conexão, que
pode ser útil em redes lentas. O custo é a sobrecarga computacional adicional para o cliente e servidor para
executar a compressão e descompressão. --compress e -C não têm argumentos depois do nome da opção.

Alguns exemplos:

 Conexão ao servidor usando o hostname e nome de utilizador padrão sem senha:

shell> mysql

 Conexão ao servidor local via memória partilhada (só em Windows). Usando nome de utilizador e senha
padrão:

shell> mysql --protocol=memory

shell> mysql --host=localhost --password --user=myname

shell> mysql -h localhost -p -u myname


shell> mysql --host=192.168.1.33 --user=myname --password=mypass

shell> mysql --host=localhost --compress

1.2.3 Using Option Files


Como alternativa a especificar opções na linha de comando, você pode colocá-los em um ficheiro. Os
programas clientes padrões do MySQL procuram ficheiros de opções em tempo de inicialização e usam as
opções apropriadas que lá encontrar. Colocar uma opção em um ficheiro economiza tempo e esforço,
porque não precisa especificar as opções na linha de comando cada vez que chamar um programa.

Opções em ficheiros são organizadas em grupos, com cada grupo precedido por uma linha [nome do grupo]
que o define. Normalmente, o nome do grupo é o nome do programa ao qual o grupo de opções se aplica.
Por exemplo, os grupos [mysql] e [mysqldump] são opções para serem usadas por mysql e mysqldump,
respectivamente. O grupo especial chamado [client], pode ser usado para especificar opções que todos os
programas clientes usem. Um uso comum para o grupo [client] é para especificar parâmetros de conexão,
pois normalmente conecta-se ao mesmo servidor, não importa qual programa cliente esteja a ser utilizado.
Para escrever uma opção em um ficheiro de opções, use a opção de formato longo que usaria na linha de
comando, mas omitindo os hífens. Se uma opção tem um valor, espaços são permitidos ao redor do sinal =,
algo que não é verdade para as opções especificadas na linha de comando. Aqui está um exemplo de um
ficheiro de opções:

[client]
host = myhost.example.com
compress

[mysql]
safe-updates

Neste exemplo, o grupo [client] especifica o nome do servidor e indica que o protocolo cliente/servidor
deve usar compressão para o tráfego enviado através da rede. Opções neste grupo se aplicam a todos os
clientes padrão. O grupo [mysql] aplica-se somente para o programa mysql. O grupo exemplificado indica
que o MySQL deve usar a opção --safe-updates. (mysql usa tanto as opções do grupo [cliente] como do
grupo [mysql], então ele irá usar todas as três opções definidas.)

O local onde um ficheiro de opções deve ser localizado depende do seu sistema operativo.

No Windows, os programas procuram os ficheiros de opções de na seguinte ordem: my.cnf e my.ini no


directório do Windows (por exemplo, a pasta C:\Windows ou C:\Winnt) e, em seguida C:\my.ini e
C:\my.cnf.
No Unix, o ficheiro /etc/my.cnf serve como um ficheiro de configuração global usado por todos os
utilizadores. Além disso, pode-se configurar ficheiros de opções específicos do utilizador, criando um
ficheiro chamado. my.cnf em seu directório raiz. Se ambos existir, o ficheiro global é lido primeiro.

Os programas olham para cada um dos ficheiros de opções padrão e lêm o que existe. Não ocorre nenhum
erro se um determinado ficheiro não for encontrado. Os programas MySQL podem aceder as opções de
múltiplos ficheiros de opções. Para usar um ficheiros de opções, criá-lo como um ficheiro texto utilizando
um editor. Para criar ou modificar um ficheiro de opções, deve ter permissão de escrita para ele. Os
programas cliente só precisam de acesso de leitura.
Para dizer a um programa para ler uma opção especifica num ficheiro de opções, use a --defaults-file =
file_name como primeira opção na linha de comando. Por exemplo, para utilizar apenas o ficheiro C:\ my-
opts para o mysql e ignorar o ficheiro de opções padrão, chame o programa da seguinte forma:

shell> mysql --defaults-file=C:\my-opts

Para dizer a um programa para ler uma opção especifica num ficheiro de opções, além de arquivos das
opções padrão, use a opção --defaults-extra-file = file_name como primeira opção na linha de comando.
Para dizer a um programa para ignorar todos os ficheiros de opções, especificar --no-defaults como
primeira opção na linha de comando.
Ficheiros de opções podem referenciar outros ficheiros a serem lidos usando as directivas !include e !
includedir:

- A linha !include file_name suspende o processamento actual. O ficheiro file_name é lido para opções
adicionais e, em seguida, o processamento recomeça.
- A linha !includedir dir_name é similar, excepto que procura-se em dir_name por ficheiros que tenham a
extensão .cnf (.cnf e .ini no Windows). Cada uma das opções desses ficheiros são lidas, e depois o
processamento continua.

Se a opção for especificada várias vezes, tanto no ficheiro de opções ou em múltiplos ficheiros, o valor da
opção que ocorrer por último tem precedência. As opções especificadas na linha de comando têm
precedência sobre as opções encontradas no ficheiro de opções.

1.2.4 Selecting a Default Database


Para a maioria dos programas cliente, deve especificar uma base de dados para que o programa saiba onde
encontrar as tabelas que deseja usar. A maneira convencional de fazer isto é especificar o nome da base de
dados na linha de comando a seguir as opções. Por exemplo, para copiar o conteúdo da base de dados
WORLD para um ficheiro de saída chamado world.sql, pode executar mysqldump assim:

shell> mysqldump --password --user=user_name world > world.sql

Para o cliente mysql, um nome de base de dados pode ser dado na linha de comando, mas é opcional
porque pode-se indicar explicitamente o nome da base de dados para qualquer tabela quando emitir
consultas. Por exemplo, a seguinte declaração selecciona as linhas da tabela Country da base de dados
WORLD:

mysql> SELECT * FROM world.Country;

Para seleccionar ou alterar a base de dados padrão durante a execução do mysql, emitir uma instrução USE
db_name, onde db_name é o nome da base de dados a ser usada. A declaração seguinte define WORLD
como base de dados padrão:

mysql> USE world;

A vantagem de seleccionar uma base de dados como padrão de uso é que em consultas posteriores pode-
se referir às tabelas sem ter que especificar o nome da BD. Por exemplo, com a BD WORLD seleccionada, as
seguintes instruções SELECT são equivalentes, mas a segunda é mais fácil, porque o nome da tabela não
precisa ser precedida do nome da BD:

mysql> SELECT * FROM world.Country;


mysql> SELECT * FROM Country;
1.2.5 Establishing a Connection with a GUI Client
Quando utilizar um cliente gráfico como o MySQL Query Browser ou MySQL Administrator, os parâmetros
usados para se conectar ao servidor são semelhantes aos utilizados para a linha de comando do cliente,
mas pode ser especificado de forma diferente. Em vez de ler opções da linha de comando, os clientes
gráficos apresentam telas com os campos que pretende preencher. Estes programas também têm a
capacidade de salvar conjuntos de parâmetros como perfis nomeados de conexão que podem ser
seleccionados pelo nome mais tarde.

1.3 Server SQL Modes


Muitas características operacionais do MySQL Server podem ser configuradas pelo SQL Mode. Esta
modalidade consiste em valores opcionais de aspecto de cada um dos controlos de processamento de
consulta. Ao configurar o modo SQL apropriado, um programa cliente pode instruir ao servidor como a
trabalhar no modo “strict” ou “forgiving” para a entrada de dados, habilitar ou desabilitar os
comportamentos relativos à conformidade do padrão SQL, ou fornecer uma melhor compatibilidade com
outras bases de dados.

--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---

By default, MySQL is forgiving of illegal or improper data values and coerces them to legal values for
data entry. However, you can change the server SQL mode to select more traditional treatment of bad
values such that the server rejects them and aborts the statement in which they occur. See
Section 5.1.7, “Server SQL Modes”.

This section describes the default (forgiving) behavior of MySQL, as well as the strict SQL mode and
how it differs.

If you are not using strict mode, then whenever you insert an “incorrect” value into a column, such as a
NULL into a NOT NULL column or a too-large numeric value into a numeric column, MySQL sets the
column to the “best possible value” instead of producing an error: The following rules describe in more
detail how this works:

 If you try to store an out of range value into a numeric column, MySQL Server instead stores
zero, the smallest possible value, or the largest possible value, whichever is closest to the
invalid value.
 For strings, MySQL stores either the empty string or as much of the string as can be stored in
the column.
 If you try to store a string that doesn't start with a number into a numeric column, MySQL Server
stores 0.
 Invalid values for ENUM and SET columns are handled as described in Section 1.7.6.3, “ENUM
and SET Constraints”.
 MySQL allows you to store certain incorrect date values into DATE and DATETIME columns
(such as '2000-02-31' or '2000-02-00'). The idea is that it is not the job of the SQL server
to validate dates. If MySQL can store a date value and retrieve exactly the same value, MySQL
stores it as given. If the date is totally wrong (outside the server's ability to store it), the special
“zero” date value '0000-00-00' is stored in the column instead.
 If you try to store NULL into a column that doesn't take NULL values, an error occurs for single-
row INSERT statements. For multiple-row INSERT statements or for INSERT INTO ...
SELECT statements, MySQL Server stores the implicit default value for the column data type. In
general, this is 0 for numeric types, the empty string ('') for string types, and the “zero” value
for date and time types. Implicit default values are discussed in Section 10.1.4, “Data Type
Default Values”.
 If an INSERT statement specifies no value for a column, MySQL inserts its default value if the
column definition includes an explicit DEFAULT clause. If the definition has no such DEFAULT
clause, MySQL inserts the implicit default value for the column data type.

The reason for using the preceding rules in non-strict mode is that we can't check these conditions until
the statement has begun executing. We can't just roll back if we encounter a problem after updating a
few rows, because the storage engine may not support rollback. The option of terminating the
statement is not that good; in this case, the update would be “half done,” which is probably the worst
possible scenario. In this case, it is better to “do the best you can” and then continue as if nothing
happened.

In MySQL 5.0.2 and up, you can select stricter treatment of input values by using the
STRICT_TRANS_TABLES or STRICT_ALL_TABLES SQL modes:

SET sql_mode = 'STRICT_TRANS_TABLES';


SET sql_mode = 'STRICT_ALL_TABLES';

STRICT_TRANS_TABLES enables strict mode for transactional storage engines, and also to some extent
for non-transactional engines. It works like this:

 For transactional storage engines, bad data values occurring anywhere in a statement cause
the statement to abort and roll back.
 For non-transactional storage engines, a statement aborts if the error occurs in the first row to
be inserted or updated. (When the error occurs in the first row, the statement can be aborted to
leave the table unchanged, just as for a transactional table.) Errors in rows after the first do not
abort the statement, because the table has already been changed by the first row. Instead, bad
data values are adjusted and result in warnings rather than errors. In other words, with
STRICT_TRANS_TABLES, a wrong value causes MySQL to roll back all updates done so far, if
that can be done without changing the table. But once the table has been changed, further
errors result in adjustments and warnings.

For even stricter checking, enable STRICT_ALL_TABLES. This is the same as STRICT_TRANS_TABLES
except that for non-transactional storage engines, errors abort the statement even for bad data in rows
following the first row. This means that if an error occurs partway through a multiple-row insert or
update for a non-transactional table, a partial update results. Earlier rows are inserted or updated, but
those from the point of the error on are not. To avoid this for non-transactional tables, either use single-
row statements or else use STRICT_TRANS_TABLES if conversion warnings rather than errors are
acceptable. To avoid problems in the first place, do not use MySQL to check column content. It is safest
(and often faster) to let the application ensure that it passes only legal values to the database.

With either of the strict mode options, you can cause errors to be treated as warnings by using INSERT
IGNORE or UPDATE IGNORE rather than INSERT or UPDATE without IGNORE

--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---

O modo de SQL é controlado através da variável de sistema sql_mode. Para atribuir um valor a esta
variável, use uma instrução SET. O valor deve ser uma string vazia, ou um ou mais nomes de modos
separados por vírgulas. Se o valor for vazio ou contiver mais do que um nome de modo, ele deve ser citado.
Se o valor contiver um nome de modo único, o valor citado é opcional. Os valores do modo SQL não são
case sensitive. Aqui estão alguns exemplos:

- Clear the SQL mode:


SET sql_mode = ‘’;

- Set the SQL mode using a single mode value:


SET sql_mode = ANSI_QUOTES;
SET sql_mode = ‘TRADITIONAL’;

- Set the SQL mode using multiple mode names:


SET sql_mode = ‘IGNORE_SPACE,ANSI_QUOTES’;
SET sql_mode = ‘STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO’;

mysql> SELECT @@sql_mode;


+----------------------------------------------+
| @@sql_mode |
+----------------------------------------------+
| STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO |
+----------------------------------------------+

Alguns valores do modo SQL são modos compostos que realmente permitem um conjunto de modos.
Valores nesta categoria incluem ANSI e TRADITIONAL. Para ver os valores que consistem os modos
compostos, verifique o valor após a seguinte definição:

mysql> SET sql_mode=’TRADITIONAL”;


Query OK, 0 rows affected (0.07 sec)

mysql> SELECT @@sql_mode\G


*************************** 1. row ***************************
@@sql_mode: STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,
NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,
NO_AUTO_CREATE_USER
1 row in set (0.03 sec)

 ANSI_QUOTES
Esta opção faz com que o MySql passe a tratar aspas duplas (“) como o carácter (‘). Isso faz com que as
aspas duplas não sejam consideradas para delimitar literais ou strings.

mysql> CREATE TABLE "test" (col INT);


ERROR 1064: You have an error in your SQL syntax. (...)

mysql> SET SQL_MODE="ANSI_QUOTES";


mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

 IGNORE_SPACE
Por padrão, as funções devem ser escritas sem espaço entre o nome da função e os parênteses. Esta opção
faz com que o MySql permita um espaço entre a função e os parênteses da função. Quando o comando
“SELECT count (*) from <<tabela>>“ sem esta opção, o MySql retorna um erro. Com esta opção activada, o
MySql retorna o resultado.

 ERROR_FOR_DIVISION_BY_ZERO
Com esta opção, o MySql retorna um erro (quando em modo restrito) ou um aviso quando houver uma
divisão por zero ou quando o uso da função MOD tiver o segundo parâmetro como zero durante um INSERT
ou um UPDATE. Caso esta opção não esteja habilitada, o MySql retorna NULL.
 STRICT_TRANS_TABLES, STRICT_ALL_TABLES
Estes valores permitem "modo restrito", que impõe certas restrições às quais os valores são aceitáveis
como entrada de dados. Por padrão, o MySQL “perdoa” a aceitação de valores em falta, fora do alcance
(outo f range) ou fora de formatos. Activar o modo restrito faz com que os valores que estejam fora do
padrão sejam tratados como erro. STRICT_TRANS_TABLES habilita o modo restrito para tabelas
transaccionais e STRICT_ALL_TABLES habilita modo restrito para todas as tabelas.

Mysql> create table teste_sql_mode (col1 smallint);


Query OK, 0 rows affected (0.08 sec)

Mysql> select @@global.sql_mode, @@session.sql_mode;


+-------------------+--------------------+
| @@global.sql_mode | @@session.sql_mode |
+-------------------+--------------------+
| | |
+-------------------+--------------------+
1 row in set (0.00 sec)

Mysql> insert into teste_sql_mode values (9),(99),(999),(9999),(99999),(999999),


(9999999);
Query OK, 7 rows affected, 3 warnings (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 3

Perceba que apesar do comando ser executado com sucesso 3 warnings são mostrados
(o problema é que dificilmente sua aplicação trata esse tipo de resultado).
Quando verificamos quais são os warnings veja o resultado:

Mysql>show warnings;
+---------+------+-----------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------+
| Warning | 1264 | Out of range value for column 'col1' at row 5 |
| Warning | 1264 | Out of range value for column 'col1' at row 6 |
| Warning | 1264 | Out of range value for column 'col1' at row 7 |
+---------+------+-----------------------------------------------+
3 rows in set (0.00 sec)

Lendo essa saída você imaginaria o que o MySQL fez com as três linhas inseridas
que extrapolaram o limite do datatype?

Mysql> select * from teste_sql_mode;


+-------+
| col1 |
+-------+
| 9 |
| 99 |
| 999 |
| 9999 |
| 32767 |
| 32767 |
| 32767 |
+-------+
7 rows in set (0.00 sec)

 TRADITIONAL
Faz com que o MySQL se comporte como um "tradicional" sistema de base de dados SQL. Uma descrição
simples deste modo é "dar um erro em vez de um aviso" ao inserir um valor incorrecto em uma coluna.
 ANSI
Esta é um modo composto que faz o MySQL Server ser mais "ANSI-like." Isto é, ele permite
comportamentos mais parecidos com o padrão SQL, tais como ANSI_QUOTES (descrito anteriormente) e
PIPES_AS_CONCAT, que faz com que || seja tratado como concatenação em vez do operador lógico OR.

You might also like