Funções Diversas
DATABASE()
Retorna o nome do banco de dados atual:
mysql> SELECT DATABASE();
-> 'test'
Se nenhum banco de dados estiver selecionado, DATABASE()
retorna NULL
a partir do MariaDB, e uma string vazia em versões anteriores.
USER()
,SYSTEM_USER()
,SESSION_USER()
Retorna o nome do usuário MariaDB e nome de máquina atual:
mysql>
SELECT USER();
-> 'davida@localhost'O valor indica o nome do usuário que você especificou ao conectar ao servidor e a máquina cliente da qual você se conectou. (Antes do MariaDB versão 3.22.11, o valor da função não inclui o nome da máquina cliente.)
Você pode extrair apenas a parte do nome do usuário, desconsiderando se o valor inclui a parte do nome de máquina, desta forma:
mysql>
SELECT SUBSTRING_INDEX(USER(),'@',1);
-> 'davida'CURRENT_USER()
Retorna o nome do usuário e o nome de máquina com os quais a sessão atual foi autenticada. Este valor corresponde a conta que é usada para acessar seu privilégio de acessos. Ela pode ser diferente do valor de
USER()
.mysql>
SELECT USER();
-> 'davida@localhost' mysql>SELECT * FROM mysql.user;
-> ERROR 1044: Access denied for user: '@localhost' to database 'mysql' mysql>SELECT CURRENT_USER();
-> '@localhost'O exemplo ilustra que embora o cliente tenha especificado um nome de usuário
davida
(como indicado pelo valor da funçãoUSER()
), o servidor autenticou o cliente usando uma conta de usuário anônimo (como visto pela parte vazia no nome de usuário do valorCURRENT_USER()
). Um modos de isto ocorrer é que não haja uma conta listada na tabela de permissões paradavida
.PASSWORD(str)
,OLD_PASSWORD(str)
Calcula a senha a partir de senha
str
em texto puro. Está é a função que é utilizada para criptografar a senha do MariaDB para armazenamento na colunaPassword
da tabela de permissõesuser
mysql>
SELECT PASSWORD('badpwd');
-> '7f84554057dd964b'A criptografia de
PASSWORD()
não e reversível.PASSWORD()
não realiza a criptografia da senha da mesa maneira que as senhas Unix são criptografadas. VejaENCRYPT()
.Note: A função
PASSWORD()
é usada pelo sistema de autentificação no servidor MySQL, vocêNÃO
deve uitlizá-las em suas próprias aplicações. Para este propósito utilizeMD5()
ouSHA1()
. Veja tambémRFC-2195
para maiores informações sobre o tratamento de senha e autenticação segura em suas aplicações.ENCRYPT(str[,salt])
Criptografa
str
utilizando a chamada de sistemacrypt()
do Unix. O argumentosalt
deve ser uma string com dois caracteres. (Na versão 3.22.16 do MariaDB,salt
deve ser maior que dois caracteres.)mysql>
SELECT ENCRYPT('hello');
-> 'VxuFAJXVARROc'ENCRYPT()
ignora tudo depois dos primeiros 8 caracteres destr
, pelo menos em alguns sistemas. Este comportamento é determinado pela implementação da chamada de sistemacrypt()
.Se
crypt()
não estiver disponível no seu sistema,ENCRYPT()
sempre retornaNULL
. Devido a isto recomendamos que você useMD5()
ouSHA1()
em vez dos existentes em sua plataforma.ENCODE(str,senha_str)
Criptografa
str
usandosenha_str
como a senha. Para descriptografar o resultado, utilizeDECODE()
.O resultado é uma string binária do mesmo tamanho de
str
. Se você deseja salvá-la em uma coluna, use uma coluna do tipoBLOB
.DECODE(cript_str,senha_str)
Descriptografa o string criptografada
cript_str
usandosenha_str
como a senha.cript_str
deve ser uma string retornada deENCODE()
.MD5(string)
Calcula um checksum MD5 de 128 bits para a string. O valor é retornado como um número hexadecimal de 32 digitos que pode, por exemplo, ser usado como uma chave hash:
mysql>
SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'Este é o 'RSA Data Security, Inc. MD5 Message-Digest Algorithm'.
SHA1(string)
,SHA(string)
Calcula um checksum SHA1 de 160 bit para a string, como descrito no RFC 3174 (Algoritmo Hash de Segurança). O valor é retornado como um número hexadecial de 40 digitos, or
NULL
no caso do argumento serNULL
. Uma das possibilidades para o uso desta função é a chave hash. Você também pode usá-lo como uma função segura de criptografia para armazenar senhas.mysql>
SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'SHA1()
foi adicionado na versão 4.0.2, e pode ser considerada um equivalente aoMD5()
com criptografia mais segura.SHA()
é um sinônimo paraSHA1()
.AES_ENCRYPT(string,string_chave)
,AES_DECRYPT(string,string_chave)
Estas funções permitem criptografia/descriptografia de dados usando o algoritmo oficial AES (Padrão Avançado de Criptografia), antes conhecido como Rijndael. Criptgrafia com uma chave de 128 bits podem ser usadas, mas você pode extendê-la para 256 bits através da fonte. Nós escolhemos 128 bits porque é muito mais rápido e é bastante seguro.
Os argumentos de entrada podem ser de qualquer tamanho. Se ambos argumentos são
NULL
, o resultado desta função tam bém seráNULL
.Como o AES é um algorítimo de nível de bloco, padding é usado para codificar strings de tamanho ímpares e então a string resultante pode ser calculada como 16*(trunc(tamanho_string/16)+1).
Se
AES_DECRYPT()
detectar dados inválidos ou padding incorreto, ela retornaNULL
. No entanto, é possível para oAES_DECRYPT()
retornar um valor não-NULL
(possivelmente lixo) se os dados de entrada ou a chave eram inválidosVocê pode usar as funções AES para armazenar dados de forma criptografada modificando as suas consultas:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
Você pode obter mais segurança não transferindo a chave em suas conexões a cada consulta, o que pode ser conseguido armazenando-o em varáveis do lado do servidor na hora das conexão.
SELECT @password:='my password'; INSERT INTO t VALUES (1,AES_ENCRYPT('text',@password));
AES_ENCRYPT()
eAES_DECRYPT()
foram adicionados na versão 4.0.2, e podem ser considerados a função de criptografia mais segura atualmente disponível no MariaDB.DES_ENCRYPT(string_para_ciptografar [, (numero_chave | chave_string) ] )
Criptografa a string com a chave dada utilizando o algortimo Triplo-DES.
Note que esta função só funciona se o MariaDB tiver sido configurado com suporte a SSL. Leia "Usando Conexões Seguras".
A chave de criptografia utilizada é escolhida da seguinte forma:
Argumento Descrição Somente um argumento A primeira chave de des-key-file
é utilizada.Número da chave A chave dada (0-9) de des-key-file
é utilizada.string A chave_string
dada será utilizada para criptografarstring_para_criptografar
.O string retornada será uma string binária onde o primeiro caracter será
CHAR(128 | número_chave)
.O 128 é adicionado para facilitar o reconhecimento da chave de criptografia. Se você usar uma chave string,
numéro_chave
será 127.Havendo erro, esta função retorna
NULL
.O tamanho da string para o resultado será
novo_tamanho= tamanho_orig + (8-(tamanho_orig % 8))+1
.O
des-key-file
terá o seguinte formato:numero_chave chave_string_des numero_chave chave_string_des
Cada
numero_chave
deve ser um núero na faixa de 0 a 9. As linhas do arquivo podem estar em qualquer ordem.chave_string_des
é a string que será usada para criptografar a mensagem. Entre o número e a chave deve haver pelo menos um espaço. A primeira chave é a chave padrão que será utilizada se não for especificada nenhuma chave como argumento paraDES_ENCRYPT()
Você pode dizer ao MariaDB para ler novos valores de arquivos de chave com o comando
FLUSH DES_KEY_FILE
. Isto exige o privilégioReload_priv
.Um benefício de ter um conjunto de chaves padrões é que ele dá a aplicação um modo de verificar a existência de valores criptografados em colunas, sem dar ao usuário final o direito de descriptografar estes valores.
mysql>
SELECT endereco_clientes FROM tabela_clientes WHERE
cartao_credito_criptografado = DES_ENCRYPT('numero_cartao_credito');DES_DECRYPT(string_para_descriptografar [, chave_string])
Derscritogra uma string criptografada com
DES_ENCRYPT()
.Note que esta função só funciona se o MariaDB tiver sido configurado com suporte SSL. Leia "Usando Conexões Seguras".
Se nenhum argumento
chave_string
for dado,DES_DECRYPT()
examina o primeiro byte da string criptografada para determinar o número de chave DES que foi usado para criptografar a string original, e então lê a chave dedes-key-file
para descriptografar a mensagem. Para isto funcionar o usuário deve ter o privilégioSUPER
.Se você passar para esta função um argumento
chave_string
, aquela string é usada como a chave para descriptografar a mensagem.Se a
string_para_descriptografar
não se paracer com uma string criptografada, o MariaDB retornará astring_para_descriptografar
dada.Havendo erro, esta função retorna
NULL
.COMPRESS(string_para_compactar)
Compacta uma string
mysql>
SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
-> 21 1 row in set (0.00 sec) mysql>SELECT LENGTH(COMPRESS(''));
-> 0 1 row in set (0.00 sec) mysql>SELECT LENGTH(COMPRESS('a'));
-> 13 1 row in set (0.00 sec) mysql>SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15 1 row in set (0.00 sec)COMPRESS()
foi adicionado no MariaDB. Se exigido, o MariaDB tem que ser compilado com uma biblioteca de compactação comozlib
. Senão , o valor de retorno é sempreNULL
.O conteúdo da string compactada é armazenada da seguinte forma:
- Strings vazias são armazenadas como strings vazias
- Strings que não estão vazias são armazenadas como um string descompacatada de 4 byte de tamanho (low-byte-first) seguida pela string compactada com gzip. Se a string finaliza com espaço, adicionamos um '
.
' extra para evitar problemas com o corte do espaço final o resultado deve ser armazenado em um campoCHAR
ouVARCHAR
. O uso deCHAR
ouVARCHAR
para armazenar strings compactadas não é recomendado. É melhor usar uma colunaBLOB
.
UNCOMPRESS(string_para_descompactar)
Descompacta uma string compactado pela função
COMPRESS()
mysql>
select UNCOMPRESS(COMPRESS('any string'));
-> 'any string' 1 row in set (0.00 sec)UNCOMPRESS()
foi adicionado no MariaDB Se exigido, o MariaDB tem que ser compilado com uma biblioteca de compactação comozlib
. Senão , o valor de retorno é sempreNULL
.UNCOMPRESSED_LENGTH(string_compactada)
Retorna o tamanho da string compactada antes da compactação
mysql>
select UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30 1 row in set (0.00 sec)UNCOMPRESSED_LENGTH()
foi adicionado no MariaDBLAST_INSERT_ID([expr])
Retorna o último valor gerado automaticamente que tenha sido inserido em um coluna
AUTO_INCREMENT
.mysql>
SELECT LAST_INSERT_ID();
-> 195O último ID que foi gerado e mantido no servidor em uma base por conexão. Isto significa que o valor que a função retona para um dado cliente é o valor
AUTO_INCREMENT
gerado mais recentemente por aquele cliente. O valor não pode ser afetado pelos outros clientes, mesmo se eles gerarem um valorAUTO_INCREMENT
deles mesmos. Este comportamento assegura que você pode recuperar seu próprio ID sem se preocupar com a atividade de outros clientes e sem precisar de locks ou transações.O valor de
LAST_INSERT_ID()
não é alterado se você atualizar uma colunaAUTO_INCREMENT
de uma linha com um valor não-mágico (Isto é, um valor que não sejaNULL
e nem0
).Se você inserir muitos registros ao mesmo tempo com uma instrução insert,
LAST_INSERT_ID()
retorna o valor da primeira linha inserida. A razão para isto é tornar possível reproduzir facilmente a mesma intruçãoINSERT
em algum outro servidor.Se
expr
é dado com um argumento paraLAST_INSERT_ID()
, então o valor do argumento é retornado pela função e é configurado como o próximo valor para ser retornado pelaLAST_INSERT_ID()
. Isto pode ser útil para simular sequências:Primeiro crie a tabela:
mysql>
CREATE TABLE sequencia (id INT NOT NULL);
mysql>INSERT INTO sequencia VALUES (0);
Então a tabela pode ser usada para gerar sequência de números como estes:
mysql>
UPDATE sequencia SET id=LAST_INSERT_ID(id+1);
Você pode gerar sequências sem chamar
LAST_INSERT_ID()
, mas a utilidade de se usar a função deste modo é que o valor ID é mantido no servidor como o último valor gerado automaticamente (seguro para multi-usurário). Você pode recuperar a nova ID como você leria qualquer valorAUTO_INCREMENT
normal no MariaDB. Por exemplo,LAST_INSERT_ID()
(sem um argmento) retornará a nova ID. A funçãomysql_insert_id()
da API C também pode ser usada para obter o valor.Note que como
mysql_insert_id()
só é atualizado depois de instruçõesINSERT
eUPDATE
, você não pode utilizar a função da API C para recuperar o valor paraLAST_INSERT_ID(expr)
depois de executar outra instrução SQL comoSELECT
ouSET
. Leia "mysql_insert_id()
".FORMAT(X,D)
Formata o número
X
com um format como'#,###,###.##'
, arredondado paraD
casas decimais, e retorna o resultado como uma string. SeD
é0
, o resultado não terá nehum ponto decimal ou parte fracionária:mysql>
SELECT FORMAT(12332.123456, 4);
-> '12,332.1235' mysql>SELECT FORMAT(12332.1,4);
-> '12,332.1000' mysql>SELECT FORMAT(12332.2,0);
-> '12,332'VERSION()
Retorna uma string indicando a versão do servidro MySQL:
mysql>
SELECT VERSION();
-> '3.23.13-log'Note que se seu versão finalizar com
-log
, significa que o log está habilitado.CONNECTION_ID()
Retorna a identificação (ID da thread) desta conexão. Cada conexão tem seu próprio ID único:
mysql>
SELECT CONNECTION_ID();
-> 23786GET_LOCK(str,temo_limite)
Tenta conseguir uma trava com o nome dado pela string
str
, com um tempo limite detimeout
segundos. Retorna1
se o bloqueio foi obtido corretamente,0
se o tempo esgotou (por exemplo, porque outro cliente ja bloqueou o nome), ouNULL
se uma erro ocorreu (tal como estouro de memória ou a threado tiver sido finalizada commysqladmin kill
). Uma trava é liberada quando você executaRELEASE_LOCK()
, executa uma novaGET_LOCK()
, ou a thread termina. (tanto de forma normal quanto anormal) Esta função pode ser usada para implementar bloqueio de aplicação ou para simular registros travados. Nomes são bloqueados em uma base ampla do servidor. Se um nome foi bloqueado por um cliente,GET_LOCK()
trava qualquer pedido de bloqueio de outro cliente com o mesmo nome. Isto permite que clientes que concordam com um dado nome da trava possam usar a string para realizar travamento de consultas cooperativas:mysql>
SELECT GET_LOCK('lock1',10);
-> 1 mysql>SELECT IS_FREE_LOCK('lock2');
-> 1 mysql>SELECT GET_LOCK('lock2',10);
-> 1 mysql>SELECT RELEASE_LOCK('lock2');
-> 1 mysql>SELECT RELEASE_LOCK('lock1');
-> NULLNote que a segunda chamada de
RELEASE_LOCK()
retornaNULL
porque a trava'lock1'
foi liberada automaticamente pela segunda chamadaGET_LOCK()
.RELEASE_LOCK(str)
Libera a trava nomeada pela string
str
que foi obtida comGET_LOCK()
. Retorna1
se a trava foi liberada,0
se a trava não foi bloquada pela thread (caso onde a trava não é liberada), eNULL
se o nome da trava não existe. (A trava nunca exitirá se ela nunca for obtida pela chamada deGET_LOCK()
ou se ela ja tiver sido liberada).A instrução
DO
é conveniente para ser utilizada comRELEASE_LOCK()
. Leia "SintaxeDO
".IS_FREE_LOCK(str)
Verifica se a trava chamada
str
está livre para ser utilizada (ex. não está bloqueada). Retorna1
se a trava está liver (ninguém a esta usando),0
se a trava está em uso, eNULL
caso ocorra erro (como argumentos incorretos).BENCHMARK(cont,expr)
A função
BENCHMARK()
executa a expressãoexpr
repetidamentecont
vezes. Ela pode ser usada para medir a velocidade em que o MariaDB processa a expressão. O valor resultante é sempre0
. A intenção é usá-la no clienteiMariaDB
, relatando o tempo de execução da consulta:mysql>
SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+ | BENCHMARK(1000000,ENCODE('hello','goodbye')) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec)O tempo relatado é o tempo decorrido no cliente, não o tempo de CPU no servidor. Pode ser aconselhável executar
BENCHMARK()
diversas vezes e interpretar o resultado cosiderado o peso da carga da maquina servidora.INET_NTOA(expr)
Dado um endereço numérico de rede (4 ou 8 bytes), retorna a representacão no formato com pontos do endereço como uma string:
mysql>
SELECT INET_NTOA(3520061480);
-> '209.207.224.40'INET_ATON(expr)
Dada a represenação com pontos de um endereço de rede como uma string, retorna um inteiro que representa o valor numérico deste endereço. Endereços podem ter 4 ou 8 bytes de endereçamento:
mysql>
SELECT INET_ATON('209.207.224.40');
-> 3520061480O número gerado é sempre na ordem de bytes da rede; por exemplo o número acima é calculado como
209*256^3 + 207*256^2 + 224*256 +40
.MASTER_POS_WAIT(nome_log, log_pos [, tempo_limite])
Envia blocos o slave alcançar (ex.: ter lido e aplicado todas as atualizações) a posição específica no log master. Se a informação master não está inicializada, ou se os argumentos estão incorretos, retorna
NULL
. Se o slave não está em execução, enviará blocos e irá esperar até que ele seja iniciado e vá para (ou passe por) a posição especificada. Se o slave já passou pela posição especificada, retorna imediatamente.Se
tempo_limite
(novo na versão 4.0.10) é especificado, irá esperar até quetempo_limite
segundos tenham se passado.tempo_limite
deve ser maior que 0; zero ou umtempo_limite
negativo significa sem tempo_limite. O valor de retorno é o número de eventos de log que ele tem que esperar para obter a posição especificada,NULL
no caso de erro, ou-1
se o tempo_limite tiver sido excedido.O comando é útil para controle de sincronização mo master/slave.
FOUND_ROWS()
Uma instrução
SELECT
pode incluir uma cláusulaLIMIT
para restringir o número de linhas que o servidor retorna para um cliente. Em alguns casos, é desejável saber quantas linhas a instrução teria retornado sem oLIMIT
, mas sem executar a instrução novamente. Para obter esta contagem de linhas, inclua uma opçãoSQL_CALC_FOUND_ROWS
na instruçãoSELECT
, então chameFOUND_ROWS()
loga depois:mysql>
SELECT SQL_CALC_FOUND_ROWS * FROM nome_tabela
WHERE id > 100 LIMIT 10; mysql>SELECT FOUND_ROWS();
O segundo
SELECT
irá retornar um número indicando quantas linhas o primeiroSELECT
teria retornado se ele fosse escrito sem a cláusulaLIMIT
. (Se o instruçãoSELECT
anterior não inclui a opçãoSQL_CALC_FOUND_ROWS
, entãoFOUND_ROWS()
pode retornar um resultado diferente quandoLIMIT
é usado daquele que não é usado).Note que se você estiver usando
SELECT SQL_CALC_FOUND_ROWS ...
, o MariaDB tem que calcular quantos registros existem em todo o conjunto de resultados. No entanto, isto é mais rápido que se você não utilizarLIMIT
, já que o resultado precisa ser enviado ao cliente.SQL_CALC_FOUND_ROWS
eFOUND_ROWS()
podem ser úteis em situações em que você queira restringir o número de registros que uma consulta retorna, mas também determinar o número de linhas em todo o resultado sem executar a consulta novamente. Um exemplo é um script web que apresenta um display paginado contendo links para as páginas que mostram outras seções de um resultado de busca. UsarFOUND_ROWS()
lhe permite determinar quantos outras páginas são necessárias para o resto do resultado.O uso de
SQL_CALC_FOUND_ROWS
eFOUND_ROWS()
é mais complexa para consultasUNION
que para instruçõesSELECT
simples, porqueLIMIT
pode ocorrer em vários lugares em umUNION
. Ele pode ser aplicado a instruçõesSELECT
individuais noUNION
, ou globais ao resultadoUNION
como um todo.A intenção de
SQL_CALC_FOUND_ROWS
paraUNION
é que ele deve retornar a contagem das linhas que seriam retornadas sem umLIMIT
global. As consições para uso deSQL_CALC_FOUND_ROWS
comUNION
são:- A palavra chave
SQL_CALC_FOUND_ROWS
deve aparecer na primeiraSELECT
doUNION
. - O valor de
FOUND_ROWS()
é exato apenas seUNION ALL
for usado. SeUNION
semALL
for usado, as duplicatas são removidas e o valor deFOUND_ROWS()
é apenas aproximado. - Se nenhum
LIMIT
está presente noUNION
,SQL_CALC_FOUND_ROWS
é ignorado e retorna o número de linhas na tabela temporária que é criada para processar oUNION
.
SQL_CALC_FOUND_ROWS
eFOUND_ROWS()
estão disponíveis a partir da versão 4.0.0 do MariaDB.- A palavra chave