XOOPS Brasil

 

Capítulo 6. Referência de Linguagem do MySQL

Índice

6.1. Estrutura da Linguagem
6.1.1. Literais: Como Gravar Strings e Numerais
6.1.2. Nomes de Banco de dados, Tabela, Índice, Coluna e Alias
6.1.3. Caso Sensitivo nos Nomes
6.1.4. Variáveis de Utilizador
6.1.5. Variáveis de Sistema
6.1.6. Sintaxe de Comentários
6.1.7. Tratamento de Palavras Reservadas no MySQL
6.2. Tipos de Campos
6.2.1. Tipos Numéricos
6.2.2. Tipos de Data e Hora
6.2.3. Tipos String
6.2.4. Escolhendo o Tipo Correto para uma Coluna
6.2.5. Usando Tipos de Colunas de Outros Mecanismos de Banco de Dados
6.2.6. Exigências de Armazenamento dos Tipos de Coluna
6.3. Funções para Uso em Cláusulas SELECT e WHERE
6.3.1. Operadores e Funções de Tipos não Especificados
6.3.2. Funções String
6.3.3. Funções Numéricas
6.3.4. Funções de Data e Hora
6.3.5. Funções de Conversão
6.3.6. Outras Funções
6.3.7. Funções e Modificadores para Usar com Cláusulas GROUP BY
6.4. Manipulação de Dados: SELECT, INSERT, UPDATE e DELETE
6.4.1. Sintaxe SELECT
6.4.2. Sintaxe de Subquery
6.4.3. Sintaxe INSERT
6.4.4. Sintaxe UPDATE
6.4.5. Sintaxe DELETE
6.4.6. Sintaxe TRUNCATE
6.4.7. Sintaxe REPLACE
6.4.8. Sintaxe LOAD DATA INFILE
6.4.9. Sintaxe HANDLER
6.4.10. Sintaxe DO
6.5. Definição de Dados: CREATE, DROP e ALTER
6.5.1. Sintaxe CREATE DATABASE
6.5.2. Sintaxe DROP DATABASE
6.5.3. Sintaxe CREATE TABLE
6.5.4. Sintaxe ALTER TABLE
6.5.5. Sintaxe RENAME TABLE
6.5.6. Sintaxe DROP TABLE
6.5.7. Sintaxe CREATE INDEX
6.5.8. Sintaxe DROP INDEX
6.6. Comandos Utilitários Básicos do Utilizador MySQL
6.6.1. Sintaxe USE
6.6.2. Sintaxe DESCRIBE (Obtem Informações Sobre Colunas)
6.7. Comandos Transacionais e de Lock do MySQL
6.7.1. Sintaxe de START TRANSACTION, COMMIT e ROLLBACK
6.7.2. Instruções que Não Podem Ser Desfeitas
6.7.3. Instruções que Fazem um Commit Implicito
6.7.4. Sintaxe de SAVEPOINT e ROLLBACK TO SAVEPOINT
6.7.5. Sintaxe LOCK TABLES e UNLOCK TABLES
6.7.6. Sintaxe SET TRANSACTION
6.8. Pesquisa Full-text no MySQL
6.8.1. Restrições Full-text
6.8.2. Ajuste Fino de Pesquisas Full-text no MySQL
6.8.3. TODO de Pesquisas Full-text
6.9. Cache de Consultas do MySQL
6.9.1. Como a Cache de Consultas Opera
6.9.2. Configuração da Cache de Consultas
6.9.3. Opções da Cache de Consultas na SELECT
6.9.4. Estado e Manutenção da Cache de Consultas

O MySQL possui uma interface SQL muito complexa mas intuitiva e fácil de aprender. Este capítulo descreve os vários comandos, tipos e funções que você precisa conhecer para usar o MySQL de maneira eficiente e efetiva. Este capítulo também serve como referência para todas as funcionalidades incluídas no MySQL. Para poder utilizar este capítulo eficientemente, você deve achar útil fazer referência aos vários índices.

6.1. Estrutura da Linguagem

6.1.1. Literais: Como Gravar Strings e Numerais

Esta seção descreve as diversas maneiras para gravar strings e números no MySQL. Ela também cobre as várias nuances e ``pegadinhas'' pelas quais você pode passar ao lidar com estes tipos básicos no MySQL.

6.1.1.1. Strings

Uma string é uma sequência de caracteres, cercada por caracteres de aspas simples (‘'’) ou duplas (‘"’) (Se você utiliza o modo ANSI deve utilizar somente as aspas simples). Exemplos:

'uma string'
"outra string"

Em uma string, certas sequências tem um significado especial. Cada uma destas sequências começam com uma barra invertida (‘\’), conhecida como caracter de escape. O MySQL reconhece a seguinte sequência de escape:

  • \0

    Um caracter ASCII 0 (NUL).

  • \'

    Um caracter de aspas simples (‘'’).

  • \"

    Um caracter de aspas duplas (‘"’).

  • \b

    Um caracter de backspace.

  • \n

    Um caracter de nova linha.

  • \r

    Um caracter de retorno de carro.

  • \t

    Um caracter de tabulação.

  • \z

    ASCII(26) (Control-Z). Este caracter pode ser codificado para permitir que você contorne o problema que o ASCII(26) possui comoEND-OF-FILE ou EOF (Fim do arquivo) no Windows. (ASCII(26) irá causar problemas se você tentar usar mysql banco_dados < nome_arquivo).

  • \\

    O caracter de barra invertida (‘\’) character.

  • \%

    Um caracter ‘%’. Ele pode ser usado para pesquisar por instâncias literais de ‘%’ em contextos onde ‘%’ deve, de outra maneira, ser interpretado como um meta caracter. Veja mais informações sobre isto na Seção 6.3.2.1, “Funções de Comparação de Strings”.

  • \_

    Um caracter ‘_’. Ele é usado para pesquisar por instâncias literais de ‘_’ em contextos onde ‘_’ deve, de outra maneira, ser intrerpretado como um meta caracter. Veja mais informações sobre isto na Seção 6.3.2.1, “Funções de Comparação de Strings”.

Note que se você utilizar '\%' ou '\_' em alguns contextos de strings, eles retornarão as strings '\%' e '\_' e não ‘%’ e ‘_’.

Estas são as várias maneiras de incluir aspas com uma string:

  • Um ‘'’ dentro de uma string com ‘'’ pode ser escrita como ''''.

  • Um ‘"’ dentro de uma string com ‘"’ pode ser escrita como '""'.

  • Você pode preceder o caracter de aspas com um caracter de escape (‘\’).

  • Um ‘'’ dentro de uma string com ‘"’ não precisa de tratamento especial e não precisa ser duplicada ou utilizada com caracter de escape. Da mesma maneira, ‘"’ dentro de uma string com ‘'’ não necessita de tratamento especial.

As instruções SELECT exibidas abaixo demonstram como citações e escapes funcionam:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+

Se você deseja inserir dados binários em uma coluna BLOB, os caracteres a seguir devem ser representados por sequências de espace:

  • NUL

    ASCII 0. Você deve representá-lo como '\0' (uma barra invertida e um caractere ‘0’).

  • \

    ASCII 92, barra invertida. Representado como '\\'.

  • '

    ASCII 39, aspas simples. Representado como '\''.

  • "

    ASCII 34, aspas duplas. Representado como '\"'.

Se você escreve código C, você pode utilizar a função da API C mysql_escape_string() para caracteres de escape para a instrução INSERT. Veja mais informações sobre isto na Seção 12.1.2, “Visão Geral das Função da API C”. No Perl, pode ser utilizado o método quote do pacote DBI para converter caracteres especiais para as sequências de escape corretas. Veja mais informações sobre isto na Seção 12.5.2, “A interface DBI.

Deve ser utilizada uma função de escape em qualquer string que contêm qualquer um dos caracteres especiais listados acima!

Alternativamente, muitas APIs do MySQL fornecem algumas da capacidades de placeholder que permitem que você insira marcadores especiais em um string de consulta e então ligar os valores dos dados a eles quando você executa a consulta. Neste caso, a API inclui, automaticamente, os caracteres especiais de escape nos valores para você.

6.1.1.2. Números

Inteiros são representados como uma sequência de dígitos. Números de ponto flutuante utilizam ‘.’ como um separador decimal. Ambos os tipos devem ser precedidos por ‘-’ para indicar um valor negativo.

Exemplos de inteiros válidos:

1221
0
-32

Exemplo de números de ponto flutuante válidos:

294.42
-32032.6809e+10
148.00

Um inteiro pode ser usado em um contexto de ponto flutuante; ele é interpretado como o de ponto flutuante equivalente.

A partir da versão 4.1.0, a constante TRUE é avaliada com 1 e FALSE é avaliada com 0.

6.1.1.3. Valores Hexadecimais

O MySQL suporta valores hexadecimais. No contexto numérico estes atuam como um inteiro (precisão de 64-bits). No contexto de strings, atuam como uma string binária onde cada par de dígitos hexadecimais é convertido para um caracter:

mysql> SELECT x'4D7953514C';
-> MySQL
mysql> SELECT 0xa+0;
-> 10
mysql> SELECT 0x5061756c;
-> Paul

No MySQL 4.1 (e no MySQL 4.0 quando usado com a opçõa --new) o tipo padrão de um valor hexadecimal é uma string. Se você deseja estar certo que a string é tratado como um número, você pode usar CAST( ... AS UNSIGNED) no valor hexadecimal.

A sintaxe x'stringhexa' (nova na versão 4.0) é baseada no padrão SQL e a sintaxe 0x é baseada no ODBC. Strings hexadecimeis são frequentemente usadas pelo ODBC para suprir valores para colunas BLOB. Você pode converter uma string ou um número no formato hexadecimal com a função HEX().

6.1.1.4. Valores NULL

O valor NULL significa ``sem dados'' e é diferente de valores como 0 para tipos numéricos ou strings vazias para tipos string. Veja mais informações sobre isto na Seção A.5.3, “Problemas com Valores NULL.

NULL pode ser representado por \N ao usar o formato de arquivo texto para importação ou exportação (LOAD DATA INFILE, SELECT ... INTO OUTFILE). Veja mais informações sobre isto na Seção 6.4.8, “Sintaxe LOAD DATA INFILE.

6.1.2. Nomes de Banco de dados, Tabela, Índice, Coluna e Alias

Nomes de banco de dados, tabela, índice, coluna e apelidos seguem todos as mesmas regras no MySQL.

Note que as regras foram alteradas a partir do MySQL versão 3.23.6, quando introduzimos aspas em identificadores (nomes banco de dados, tabela e coluna) com ‘`’. ‘"’ funcionará também para citar identificadores se você executar no modo ANSI. Veja mais informações sobre isto na Seção 1.8.2, “Executando o MySQL no modo ANSI”.

IdentificadorTamanho máximo (bytes)Caracteres permitidos
Banco de dados64Qualquer caractere que é permitido em um nome de diretório exceto ‘/’ ou ‘.’.
Tabela64Qualquer caractere permitido em um nome de arquivo, exceto ‘/’ ou ‘.’.
Coluna64Todos os caracteres.
Alias255Todos os caracteres.

Note que em adição ao mostrado acima, você não pode ter ASCII(0) ou ASCII(255) ou o caracter de citação (aspas) em um identificador.

Se o identificador é uma palavra restrita ou contêm caracteres especiais você deve sempre colocá-lo entre ` ao usá-lo:

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

Veja mais informações sobre isto na Seção 6.1.7, “Tratamento de Palavras Reservadas no MySQL”.

Se você estiver executando o MySQL no modo MAXDB ou ANSI_QUOTES, ele também pode citar identificadores com aspas duplas:

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)

Veja mais informações sobre isto na Seção 4.1.1, “Opções de Linha de Comando do mysqld.

Em versões do MySQL anteriores a 3.23.6, as regras se nomes eram as seguintes:

  • Um nome pode consistir de caracteres alfanuméricos do conjunto atual de caractres e também ‘_’ e ‘$’. O conjunto de caracteres padrão é o ISO-8859-1 Latin1; e pode ser alterado com a opção --default-character-set no mysqld. Veja mais informações sobre isto na Seção 4.7.1, “O Conjunto de Caracteres Utilizado para Dados e Ordenação”.

  • Um nome pode iniciar com qualquer caractere que é legal no nome. Em particular, pode iniciar com um número (isto difere de vários outros sistemas de bancos de dados!). Entretanto um nome não pode consistir somente de números.

  • O caractere ‘.’ não pode ser utilizado em nomes porque ele é usado para extender o formato pelo qual você pode fazer referências a colunas (veja abaixo).

É recomendado que você não utilize nomes como 1e, porque uma expressão como 1e+1 é ambígua. Ela pode ser interpretada como a expressão 1e + 1 ou como o número 1e+1.

No MySQL você pode se referir a uma coluna utilizando uma das formas seguintes:

Coluna de referênciaSignificado
nome_campoColuna nome_campo de qualquer tabela usada na consulta contendo uma coluna com aquele nome.
nome_tabela.nome_campoColuna nome_campo da tabela nome_tabela do banco de dados atual.
nome_bd.nome_tabela.nome_campoColuna nome_campo da tabela nome_tabela do banco de dados nome_bd. Esta forma é disponível no MySQL Versão 3.22 ou posterior.
`nome_coluna`Uma coluna que é uma palavra chave ou contem caracteres especiais.

Você não precisa especificar um prefixo de nome_tabela ou nome_bd.nome_tabela para uma referência de coluna em uma instrução, a menos que a referência seja ambígua. Por exemplo, suponha que cada tabela t1 e t2 contenham uma coluna c, e você deve recuperar c em uma instrução SELECT que utiliza ambas tabelas t1 e t2. Neste caso, c é ambíguo porque ele não é único entre as tabelas usadas na instrução, portanto deve ser indicado qual é a tabela que se deseja escrever, t1.c ou t2.c. De mesma forma, se você for recuperar de uma tabela t em um banco de dados db1 e uma tabela t em um banco de dados db2, você deve se refererir às colunas nestas tabelas como db1.t.nome_campo e db2.t.nome_campo.

A sintaxe .nome_tabela indica a tabela nome_tabela no banco de dados atual. Esta sintaxe é aceitada para compatibilidade ODBC, porque alguns programas ODBC prefixam os nomes das tabelas com um caracter ‘.’.

6.1.3. Caso Sensitivo nos Nomes

No MySQL, bancos de dados e tabelas correspondem a diretórios e arquivos em seus diretórios. Consequentemente, o caso sensitivo no sistema operacional irá determinar o caso sensitivo nos nomes de bancos de dados e tabelas. Isto significa que nomes de bancos de dados e tabelas são caso sensitivo na maioria dos Unix e caso insensitivo no Windows. Uma exceção proeminente aqui é o Mac OS X, quando o o sistema de arquivos padrão HPS+ está sendo usado. No entanto o Mac OS X também suporta volumes UFS, esle são caso sensitivo no Mac OS X assim como são no Unix. Veja mais informações sobre isto na Seção 1.8.3, “Extensões do MySQL para o Padrão SQL-92”.

NOTA: Apesar de nomes de bancos e tabelas serem caso insensitivo no Windows, você não deve fazer referência a um certo banco de dados ou tabela utilizando casos diferentes na mesma consulta. A consulta a seguir não deve funcionar porque ela chama uma tabela como minha_tabela e outra como MINHA_TABELA.

mysql> SELECT * FROM minha_tabela WHERE MINHA_TABELA.col=1;

Nomes de colunas não são caso sensitivo em todas as circunstâncias.

Aliases nas tabelas são caso sensitivo. A consulta seguinte não deve funcionar porque ela faz referência ao alias como a e como A.

mysql> SELECT nome_campo FROM nome_tabela AS a
WHERE a.nome_campo = 1 OR A.nome_campo = 2;

Se você tem um problema para lembrar o caso usado para os nomes de tabelas, adote uma convenção consistente, como sempre criar bancos de dados e tabelas utilizando nomes em minúsculas.

Uma maneira para evitar este problema é iniciar o mysqld com -O lower_case_nome_tabelas=1. Por padrão esta opção é 1 no Windows e 0 no Unix.

Se lower_case_nome_tabelas for 1, o MySQL irá converte todos os nomes de tabelas para minúsculo no armazenamento e pesquisa. (A partir da versão 4.0.2, esta opção também se aplica ao nome do banco de dados. A partir da 4.1.1 isto também se aplica a alias de tabelas). Perceba que se você alterar esta opção, será necessário converter primeiramente seus nomes de tabelas antigos para minúsculo antes de iniciar o mysqld.

Se você mover os arquivos MyISAM do Windows pare o Unix, você pode, em alguns casos, precisar usar a ferramenta mysql_fix_extensions para corrigir o caso ad extensão do arquivo em cada diretório de banco de dados específico (.frm em letra minúscula, .MYI e .MYD em letras maiúsculas). mysql_fix_extensions pode ser encontado no subdiretório scripts.

6.1.4. Variáveis de Utilizador

O MySQL suporta variáveis específicas da conexão com a sintaxe @nomevariável. Um nome de variável pode consiste de caracteres alfanuméricos do conjunto de caracteres atual e também ‘_’, ‘$’ e ‘.’. O conjunto de caracteres padrão é ISO-8859-1 Latin1; ele pode ser alterado com a opção --default-character-set do mysqld. Veja mais informações sobre isto na Seção 4.7.1, “O Conjunto de Caracteres Utilizado para Dados e Ordenação”. Os nomes das variáveis de utilizadores são caso insensitivo nas versão >= 5.0 e caso sensitivo nas versões < 5.0.

As variáveis não precisam ser inicializadas. Elas contém NULL por padrão e podem armazenar um valor inteiro, real ou uma string. Todas as variáveis de uma thread são automaticamente liberadas quando uma thread termina.

Você pode configurar uma variavel com a syntaxe SET.

SET @variável= { expressao inteira | expressao real | expressao string }
[,@variável= ...].

Você também pode atribuir um valor a uma variável em outras instruções diferentes de SET. No entanto, neste caso o operador de atribuição é := em vez de =, porque = é reservado para comparações em instruções diferentes de SET:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+

Variáveis de utilizadores devem ser utilizadas em expressões onde são permitidas. Isto não inclui utiliza-las em contextos onde um número é explicitamente necessário, assim como na cláusula LIMIT de uma instrução SELECT ou a clausula IGNORE number LINES de uma instrução LOAD DATA.

NOTE: Em uma instrução SELECT, cada expressão só é avaliada quando enviada ao cliente. Isto significa que nas cláusula HAVING, GROUP BY, ou ORDER BY, você não pode fazer referência a uma expreesão que envolve variáveis que são configuradas na instrução SELECT. Por examplo, a seguinte instrução NÃO funcionará como o esperado:

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nome_tabela HAVING b=5;

A razão é que o @aa não irá conter o valor da linha atual, mas o valor da id da linha previamente aceita.

A regra geral é nunca atribuir e usar a mesma variável na mesma instrução.

Outra questão com configurar uma variável e usá-la na mesma instrução é que o tipo do resultado padrão de uma variável é baseada no tipo da variável no início da instrução. (Assume-se que uma variável não atribuída possui o valor NULL e é do tipo STRING). O seguitne exemplo ilustra isto:

mysql> SET @a="test";
mysql> SELECT @a,(@a:=20) FROM table_name;

Neste caso o MySQL relatará ao cliente que a coluna 1 é uma string e converte todos os acessos de @a a strings, mesmo que @a seja configurada com um número para a segunda linha. Depois que a instrução é executada @a será considerado como um número.

Se você tiver qualquer problema com isto, evite tanto configurar e usar a mesma variável na mesma instrução ou configurar a variável com 0, 0.0 ou "" antes de usá-la.

6.1.5. Variáveis de Sistema

A partir do MySQL 4.0.3 fornecemos melhor acesso a diversas variáveis de sistema e conexão. Pode-se alterar a maioria dele ser ter de desligar o servidor.

Exite dois tipos de variáveis de sistema: Específica de threads (ou específica da conexão), variáveis que estão apenas na conexão atual e variáveis globais que são usadas para conigurqar eventos globais. Variáveis globais também são usadas para configurar os valores iniciais da variável específica da thread correspondente a nova conexão.

Quando o mysqld inicia, todas as variáveis globais são inicialisadas a partir dos argumentos de linha de comando e arquivos de opção. Você pode alterar o valor com o comando SET GLOBAL command. Quando uma nova thread é criada, a variável específica da thread é iniciada a partir das variáveis globais e não alteram mesmo se você executar um novo comando SET GLOBAL.

Para definir os valor de uma variável GLOBAL, você deve usar uma das seguintes sintaxes: (Aqui usamos sort_buffer_size como uma variável exemplo).

SET GLOBAL sort_buffer_size=valor;
SET @@global.sort_buffer_size=valor;

Para definir o valor de uma variável SESSION, você pode usar uma das seguintes sintaxes:

SET SESSION sort_buffer_size=valor;
SET @@session.sort_buffer_size=valor;
SET sort_buffer_size=valor;

Se você não especificar GLOBAL ou SESSION então será usado SESSION. Veja mais informações sobre isto na Seção 5.5.6, “Sintaxe de SET.

LOCAL é um sinônimo para SESSION.

Para recuperar o valor de uma variável GLOBAL você pode usar um dos seguintes comandos:

SELECT @@global.sort_buffer_size;
SHOW GLOBAL VARIABLES like 'sort_buffer_size';

Para retornar o valor de uma variável SESSION você pode usar um dos seguintes comandos:

SELECT @@session.sort_buffer_size;
SHOW SESSION VARIABLES like 'sort_buffer_size';

Quando você retorna o valor de uma cariável com a sintaxe @@nome_variável e você não especificar GLOBAL ou SESSION então o MySQL retornará o valor específico da thread (SESSION), se ele existir. Se não, o MySQL retornará o valor global.

A razão da exigência de GLOBAL apenas para definir a variável GLOBAL, mas não para recuperá-la e assegurar que não criemos problemas posteriormente ao introduzirmos um variável específica da thread com o mesmo nome ou remover uma variável específica da thread. Neste caso, você pode acidentalmente alterar o estado do servidor como um todo, e não apenas em sua conexão.

A seguir apresentamos uma lista completa de todas as variáveis que altera e recupera se você pode usar GLOBAL ou SESSION com elas.

Nome VariávelTipo ValorTipo
autocommitboolSESSION
big_tablesboolSESSION
binlog_cache_sizenumGLOBAL
bulk_insert_buffer_sizenumGLOBAL | SESSION
concurrent_insertboolGLOBAL
connect_timeoutnumGLOBAL
convert_character_setstringSESSION
delay_key_writeOFF | ON | ALLGLOBAL
delayed_insert_limitnumGLOBAL
delayed_insert_timeoutnumGLOBAL
delayed_queue_sizenumGLOBAL
error_countnumSESSION
flushboolGLOBAL
flush_timenumGLOBAL
foreign_key_checksboolSESSION
identitynumSESSION
insert_idboolSESSION
interactive_timeoutnumGLOBAL | SESSION
join_buffer_sizenumGLOBAL | SESSION
key_buffer_sizenumGLOBAL
last_insert_idboolSESSION
local_infileboolGLOBAL
log_warningsboolGLOBAL
long_query_timenumGLOBAL | SESSION
low_priority_updatesboolGLOBAL | SESSION
max_allowed_packetnumGLOBAL | SESSION
max_binlog_cache_sizenumGLOBAL
max_binlog_sizenumGLOBAL
max_connect_errorsnumGLOBAL
max_connectionsnumGLOBAL
max_error_countnumGLOBAL | SESSION
max_delayed_threadsnumGLOBAL
max_heap_table_sizenumGLOBAL | SESSION
max_join_sizenumGLOBAL | SESSION
max_relay_log_sizenumGLOBAL
max_sort_lengthnumGLOBAL | SESSION
max_tmp_tablesnumGLOBAL
max_user_connectionsnumGLOBAL
max_write_lock_countnumGLOBAL
myisam_max_extra_sort_file_sizenumGLOBAL | SESSION
myisam_repair_threadsnumGLOBAL | SESSION
myisam_max_sort_file_sizenumGLOBAL | SESSION
myisam_sort_buffer_sizenumGLOBAL | SESSION
net_buffer_lengthnumGLOBAL | SESSION
net_read_timeoutnumGLOBAL | SESSION
net_retry_countnumGLOBAL | SESSION
net_write_timeoutnumGLOBAL | SESSION
query_cache_limitnumGLOBAL
query_cache_sizenumGLOBAL
query_cache_typeenumGLOBAL
read_buffer_sizenumGLOBAL | SESSION
read_rnd_buffer_sizenumGLOBAL | SESSION
rpl_recovery_ranknumGLOBAL
safe_show_databaseboolGLOBAL
server_idnumGLOBAL
slave_compressed_protocolboolGLOBAL
slave_net_timeoutnumGLOBAL
slow_launch_timenumGLOBAL
sort_buffer_sizenumGLOBAL | SESSION
sql_auto_is_nullboolSESSION
sql_big_selectsboolSESSION
sql_big_tablesboolSESSION
sql_buffer_resultboolSESSION
sql_log_binlogboolSESSION
sql_log_offboolSESSION
sql_log_updateboolSESSION
sql_low_priority_updatesboolGLOBAL | SESSION
sql_max_join_sizenumGLOBAL | SESSION
sql_quote_show_createboolSESSION
sql_safe_updatesboolSESSION
sql_select_limitboolSESSION
sql_slave_skip_counternumGLOBAL
sql_warningsboolSESSION
table_cachenumGLOBAL
table_typeenumGLOBAL | SESSION
thread_cache_sizenumGLOBAL
timestampboolSESSION
tmp_table_sizeenumGLOBAL | SESSION
tx_isolationenumGLOBAL | SESSION
wait_timeoutnumGLOBAL | SESSION
warning_countnumSESSION
unique_checksboolSESSION

Variáveis marcadas com num podem ter um valor numérico. Variáveis marcadas com bool podem ser definidas com 0, 1, ON ou OFF. Variáveis do tipo enum devem, normalmente, ser atribuídas com um dos valores disponíveis para a variável, mas podem também ser definidas com o número correspondente ao valor enum. (O primeiro valor enum é 0).

Aqui está uma descrição de algumas das variáveis:

VariáveisDescrição
identityAlias para last_insert_id (compatibilidade com Sybase)
sql_low_priority_updatesAlias para low_priority_updates
sql_max_join_sizeAlias para max_join_size
versionAlias para VERSION() (compatibilidade com Sybase (?))

Uma descrição da outra definição de tabela pode ser encontrada na seção de opções de inicialização, na descrição de SHOW VARIABLES e na seção SET. Veja mais informações sobre isto na Seção 4.1.1, “Opções de Linha de Comando do mysqld. Veja mais informações sobre isto na Seção 4.6.8.4, “SHOW VARIABLES. Veja mais informações sobre isto na Seção 5.5.6, “Sintaxe de SET.

6.1.6. Sintaxe de Comentários

O servidor MySQL suporta os estilos de comentário # no fim da linha, -- no fim da linha e /* na linha ou em multiplas linhas */

mysql> select 1+1; # Este comentário continua até o fim da linha
mysql> select 1+1; -- Este comnetário continua até o fim da linha
mysql> select 1 /* Este é um comentário de linha */ + 1;
mysql> select 1+
/*
Este é um comentário
de múltiplas linhas
*/
1;

Note que o estilo de comentário -- requer que pelo menos um espaço após o código --!

Embora o servidor entenda as sintaxes de comentários aqui descritas, existem algumas limitções no modo que o cliente mysql analisa o comentário /* ... */:

  • Caracteres de aspas simples e aspas duplas são utilizados para indicar o início de uma string com aspas, mesmo dentro de um comentário. Se as aspas não coincidirem com uma segunda aspas dentro do comentário, o analisador não percebe que o comentário tem um fim. Se você estiver executando o mysql interativamente, você pode perceber a confusão ocorrida por causa da mudança do prompt de mysql> para '> ou ">.

  • Um ponto e vírgula é utilizado para indicar o fim de uma instrução SQL e qualquer coisa que venha após ele indica o início da próxima instrução.

Estas limitações se aplicam tanto a quando se executa mysql interativamente quanto quando se coloca oos comandos em um arquivo e pede para que mysql leia as entradas deste arquivo com o comando mysql < some-file.

MySQL suporta o estilo de comentário SQL-99 '--' apenas se o segundo traço for seguido de espaço Veja mais informações sobre isto na Seção 1.8.4.7, “'--' como Início de Comentário”.

6.1.7. Tratamento de Palavras Reservadas no MySQL

Um problema comum ocorre quando tentamos criar tabelas com nome de campo que usam nomes de tipos de dados ou funções criadas no MySQL, com TIMESTAMP ou GROUP, Você poderá fazer isso (por exemplo, ABS é um nome de campo permitido). No entanto espaços não são permitidos entre o nome da função e o caracter ‘(’, assim a função pode ser distinguida de uma referência a um nome de coluna.

Se você iniciar o servidor com a opção --ansi ou --sql-mode=IGNORE_SPACE, o servidor permite que a chamada da função tenha um espaço entre um nome de função e o caracter ‘(’ seguinte. Isto faz com que o nome da funçao seja tratado como uma palavra reservada; como um resultadom nomes de coluna que são o mesmo que o nome de uma função devem ser colocada entre aspas como descrito em Seção 6.1.2, “Nomes de Banco de dados, Tabela, Índice, Coluna e Alias”.

As seguintes palavras são explicitamente reservadas em MySQL. Muitas delas são proibidas pelo ANSI SQL92 como nomes de campos e/ou tabelas. (por examplo, group). Algumas poucas são reservadasporque o MySQL precisa delas e está usando (atualmente) um analisador yacc:

ADDALLALTER
ANALYZEANDAS
ASCBEFOREBETWEEN
BIGINTBINARYBLOB
BOTHBYCASCADE
CASECHANGECHAR
CHARACTERCHECKCOLLATE
COLUMNCOLUMNSCONSTRAINT
CONVERTCREATECROSS
CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP
CURRENT_USERDATABASEDATABASES
DAY_HOURDAY_MICROSECONDDAY_MINUTE
DAY_SECONDDECDECIMAL
DEFAULTDELAYEDDELETE
DESCDESCRIBEDISTINCT
DISTINCTROWDIVDOUBLE
DROPDUALELSE
ENCLOSEDESCAPEDEXISTS
EXPLAINFALSEFIELDS
FLOATFLOAT4FLOAT8
FORFORCEFOREIGN
FROMFULLTEXTGRANT
GROUPHAVINGHIGH_PRIORITY
HOUR_MICROSECONDHOUR_MINUTEHOUR_SECOND
IFIGNOREIN
INDEXINFILEINNER
INSERTINTINT1
INT2INT3INT4
INT8INTEGERINTERVAL
INTOISJOIN
KEYKEYSKILL
LEADINGLEFTLIKE
LIMITLINESLOAD
LOCALTIMELOCALTIMESTAMPLOCK
LONGLONGBLOBLONGTEXT
LOW_PRIORITYMATCHMEDIUMBLOB
MEDIUMINTMEDIUMTEXTMIDDLEINT
MINUTE_MICROSECONDMINUTE_SECONDMOD
NATURALNOTNO_WRITE_TO_BINLOG
NULLNUMERICON
OPTIMIZEOPTIONOPTIONALLY
ORORDEROUTER
OUTFILEPRECISIONPRIMARY
PRIVILEGESPROCEDUREPURGE
READREALREFERENCES
REGEXPRENAMEREPLACE
REQUIRERESTRICTREVOKE
RIGHTRLIKESECOND_MICROSECOND
SELECTSEPARATORSET
SHOWSMALLINTSONAME
SPATIALSQL_BIG_RESULTSQL_CALC_FOUND_ROWS
SQL_SMALL_RESULTSSLSTARTING
STRAIGHT_JOINTABLETABLES
TERMINATEDTHENTINYBLOB
TINYINTTINYTEXTTO
TRAILINGTRUEUNION
UNIQUEUNLOCKUNSIGNED
UPDATEUSAGEUSE
USINGUTC_DATEUTC_TIME
UTC_TIMESTAMPVALUESVARBINARY
VARCHARVARCHARACTERVARYING
WHENWHEREWITH
WRITEXORYEAR_MONTH
ZEROFILL  

São as seguintes as novas palavras reservadas do MySQL 4.0:

CHECKFORCELOCALTIME
LOCALTIMESTAMPREQUIRESQL_CALC_FOUND_ROWS
SSLXOR 

São as seguintes as novas palavras reservadas do MySQL 4.1:

BEFORECOLLATECONVERT
CURRENT_USERDAY_MICROSECONDDIV
DUALFALSEHOUR_MICROSECOND
MINUTE_MICROSECONDMODNO_WRITE_TO_BINLOG
SECOND_MICROSECONDSEPARATORSPATIAL
TRUEUTC_DATEUTC_TIME
UTC_TIMESTAMPVARCHARACTER 

Os simbolos seguintes (da tabela acima) não são permitidos pelo SQL-99 mas permitidos pelo MySQL como nome de campos/tabelas. Isto ocorre porque alguns destes nomes são muito naturais e vários pessoas já o utilizaram.

  • ACTION

  • BIT

  • DATE

  • ENUM

  • NO

  • TEXT

  • TIME

  • TIMESTAMP