Aplicativos em PHP/Administração dos SGBDs/MySQL

Instalação

Para testes locais uma instalação prática é com o pacote Xampp

http://xampp.sf.net

Para uso em servidores onde se exige segurança idealmente instalar compilando os fontes para um controle maior das características instaladas.

Executando

Uma boa opção de administração do MySQL é o phpmyadmin, que também acompanha o Xampp.

Para administração pela linha de comando use:

mysql -h host -u user -p (o super usuário default é root)

mysql -u root (quando estiver sem senha)

Trocando a senha do usuário root

Acessar o servidor do MySQL:
mysql -u root mysql (Usuário root acessar banco mysql)

Alterar senha atual do root para novasenha:
UPDATE user SET Password=PASSWORD("novasenha") WHERE user="root";

Atualizar os procedimentos:
FLUSH PRIVILEGES;

Criando Usuários e Concedendo Privilégios

mysql --user=root mysql

GRANT ALL PRIVILEGES ON *.* TO super@localhost IDENTIFIED BY 'senha' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO super@"%" IDENTIFIED BY 'some_pass' WITH GRANT OPTION;

super - é um total super usuário que pode se conectar no localhost e de qualquer lugar ("%"), mas precisa usar senha

GRANT RELOAD,PROCESS ON *.* TO admin@localhost;

admin - usuário que pode se conectar no localhost sem senha.

Pode executar os comandos mysqladmin reload, mysqladmin refresh, and mysqladmin flush-* e mysqladmin processlist . Não tem nenhum privilégio relacionado aos bancos.

GRANT USAGE ON *.* TO fraco@localhost;

fraco - pode conectar somente via localhost sem senha mas sem privilégios, somente para uso.

Exemplo:

GRANT ALL PRIVILEGES ON *.* TO ribafs@localhost IDENTIFIED BY 'ribafs' WITH GRANT OPTION;

mysql -u ribafs // Dá erro de senha

mysql -u ribafs -p //Funciona após entrar a senha ribafs

Criando Usuários de Olho na Segurança

Este usuário somente conecta o MySQL via localhost.

- Abrir phpMyAdmin como super usuário
- Clicar no link Privilégios
- Clicar em Adicionar novo usuário
- Entre com o nome do usuário
- Em servidor selecione Local
- Em senha selecione Sem senha
- Abaixo em Privilégios globais selecione todas as checkbox Dados
- Caso queira marcar mais algum dos privilégios, faça-o e clique em Executar.

Pronto, este usuário somente poderá realizar conexões locais e não terá nenhum privilégio a não ser os de cadastrar os dados (nada de excluir, criar ou alterar a estrutura do banco).

Removendo Usuários

DROP USER nomeusuario;

Privilégios

REVOKE GRANT ALL ON nomebancooutabelaou*ou*.* FROM nomeusuario

  • - todas as tabelas
  • .* todos os bancos e todas as tabelas

banco.* - todas as tabelas do banco

GRANT SELECT,INSERT,UPDATE ON nomebanco.* TO nomeuser;

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON nomebanco.* TO usuario@localhost IDENTIFIED BY 'senha';

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON nomebanco.* TO usuario@dominio.com.br IDENTIFIED BY 'senha';

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON nomebanco.* TO usuario@'%' IDENTIFIED BY 'senha';

Instalando como Serviço

Instalar MySQL como serviço no Windows para trabalhar com Java (J2EE):

mysqld-nt --install --ansi --sql-mode=ANSI_QUOTES

Instalar como serviço:

bin\mysqld-nt --install mysql


Remover o serviço:

bin\mysqld --remove mysql

Remover serviço ansi:

bin\mysqld --remove --ansi

Removendo Serviços no Windows XP/NT

mysql\bin\mysqld -- remove (remove o serviço mysql) -- remove --ansi (remover o serviço ansi)

Criando Bancos e Tabelas

CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]

CREATE TABLE tbl_name (column_list)
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
Example:
CREATE TABLE t1 ( ... ) CHARACTER SET latin1 COLLATE latin1_danish_ci;

col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name] [COLLATE collation_name]

Exemplo:
CREATE TABLE Table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);

Criar Tabelas com Relacionamentos

create table produto(
	codigo int not null primary key, 
	nome varchar(50) not null unique, 
	descricao varchar(200), 
	valor real(6, 2)
) ENGINE=INNODB;

create table cliente(
	codigo int not null primary key, 
	nome varchar(50) not null, 
	email varchar(100) not null unique, 
	cpf varchar(11) not null
) ENGINE=INNODB;

create table pedido(
	numero int not null primary key auto_increment, 
	codigocliente int not null references cliente(codigo), 
	valortotal real(7,2) DEFAULT '0.00' NOT NULL
) ENGINE=INNODB;

create table item(
	numeropedido int not null references pedido(numero), 
	codigoproduto int not null references produto(codigo), 
	quantidade int not null, 
	primary key(numeropedido, codigoproduto)
) ENGINE=INNODB;

CREATE TABLE product (
	category INT NOT NULL, 
	id INT NOT NULL,
	price DECIMAL,
	PRIMARY KEY(category, id)
) ENGINE=INNODB;

CREATE TABLE product_order (
	no INT NOT NULL AUTO_INCREMENT,
	product_category INT NOT NULL,
	product_id INT NOT NULL,
	customer_id INT NOT NULL,
	PRIMARY KEY(no),
	INDEX (product_category, product_id),
	FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) 
           ON UPDATE CASCADE ON DELETE RESTRICT, 
        INDEX (customer_id),
	FOREIGN KEY (customer_id) REFERENCES customer(id)
) ENGINE=INNODB;

O tipo InnoDb dá suporte à constraint Foreign Key (references).

Usando o MySQL

1) mysql -u root -p ou mysql -u root

mysql -h host -u user -p banco

Obs: Caso receba a mensagem: Can't connect to MySQL server on 'localhost'

Falta startar o MySQL

2) create database nomebanco;

3) use nomebanco;

4) create table nometabela(campos tipos...);

5) select * from nometabela;

6) show databases;

7) show tables;

8) describe nometabela;

Importação e Exportação de Dados e Estruturas

Exportando:

bin\mysqldump -u user -p passwd banco > banco.sql

Importando:

bin\mysql -u user -p password banco < banco.sql

IMPORTAR Todos os Bancos de um Script

Temos um script contendo diversos bancos então:

mysql -u root < varios_bancos.sql

Mudar Conjunto de Caracters para LATIN1

musql -u root

\C latin1

Importação e Exportação com o phpMyAdmin

Exportar todo um banco

- Abrir o phpMyAdmin e selecionar o banco

- Clicar no botão Exportar

- Basta rolar a tela e clicar em Executar abaixo

- O conteúdo será exibido na tela. Devemos então selecionar e criar um arquivo texto com o mesmo. Por convenção criamos arquivos com a extensão .sql.

- Também podemos exportar para um arquivo compactado. Basta clicar na opção "Compactado com zip ou gzip.

- Existem muitas outras opções para a exportação.

Caso queira exportar somente uma tabela o processo é o mesmo, mudando apenas que devemos selecionar apenas a tabela desejada.

Populando Tabelas após a criação

O comando LOAD DATA pode ser utilizado para popular tabelas, trazendo de arquivos:

LOAD DATA LOCAL INFILE '/path/arquivo.txt' INTO TABLE nometabela;

SELECT DATABASE();

SHOW CHARACTER SET;

Importar CSV no MySQL

$handle = fopen ('./file.csv', 'r');
		while (($data = fgetcsv($handle, 1000, ',', '"')) !== FALSE)
		{
			$query = "INSERT INTO services VALUES ('". implode("','", $data)."')";
 			$query = @mysql_query($query);
		}

LOAD DATA INFILE "./ImportData.csv"
     INTO TABLE table1
     FIELDS TERMINATED BY ","
     OPTIONALLY ENCLOSED BY """"
     LINES TERMINATED BY "\r\n";

OPTIONALLY ENCLOSED is optional.

Funções com Datas

DATE_SUB
SELECT something FROM tbl_name WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');

DATE_ADD
SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);

SELECT CURDATE();

SELECT CURTIME();

DATE_FORMAT
SELECT date_format( '2006-04-30', '%d/%m/%Y' ); -- 30/04/2006
SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')); -- 03.10.2003
SELECT DATE_FORMAT('2006-06-00', '%d/%m/%Y');

SELECT NOW();

SELECT TO_DAYS('1997-10-07'); -- RETORNA DIAS

SELECT YEAR('2000-01-01');

Ativando o suporte a INNODB no MySQL do XAMPP

A versão atual do phpMyAdmin que vem no Xampp 1.62 ainda vem sem o suporte a InnoDB.

Acontece que se você baixar a versão do phpMyAdmin atual (2.10.2) esta já vem com o suporte ativado e este tutorial não se faz necessário, apenas para versões anteriores. Acredito que versões posteriores do Xampp também já venham com esse suporte ativado.

Detalhe: Apenas faça o download do phpMyAdmin (http://www.phpmyadmin.net), descompacte no diretório web e sem nenhuma configuração abra no navegador.

O tipo de tabelas padrão do MySQL (MyISAM) não oferece suporte a relacionamentos (chave estrangeira). Para isso precisamos ativar o suporte a um tipo de tabelas de terceitos (InnoDB).

Editar o arquivo my.cnf:

D:\_xampplite\mysql\bin\my.cnf

Caso apareça um arquivo "my" sem extensão clique com o botão direito, enviar para e abra num editor de texto e faça as seguintes alterações:

Comentar a linha:

#skip-innodb

Descomentar as linhas:

innodb_data_home_dir = D:/_xampplite/mysql/data/
innodb_data_file_path = ibdata1:10M:autoextend 
innodb_log_group_home_dir = D:/_xampplite/mysql/data/
innodb_log_arch_dir = D:/_xampplite/mysql/data/

set-variable = innodb_buffer_pool_size=16M 
set-variable = innodb_additional_mem_pool_size=2M 

set-variable = innodb_log_file_size=5M 
set-variable = innodb_log_buffer_size=8M 
innodb_flush_log_at_trx_commit=1 
set-variable = innodb_lock_wait_timeout=50 

Pronto. Reinicie o MySQL e agora você pode criar tabelas com suporte a INNODB (consequentemente foreign key e relacionamentos).

Conversão de Funções do MySQL para o PostgreSQL no PHP

Na conversão de scripts em PHP com MySQL para PHP com PostgreSQL temos que atendar para vários detalhes: nomes das funções (ex.: mysql_connect para pg_connect), sintaxe das funções, que varia em muitas delas (veremos adiante), estrutura do banco: tipos de tabelas, tipos de dados, auto-incremento, etc. Óbvio que para converter entre dois SGBDs devemos conhecer as características de ambos. Exemplo: como vou usar um tipo de dados do MySQL no PostgreSQL, se este não tem o referido tipo? Deverei encontrar no PostgreSQL, um tipo que satisfaça os requisitos daquele do MySQL (para isso precisarei conhecer as características dos tipos de ambos, suas faixas de valores, tipos de dados, etc).

Alguns Exemplos de Conversão de Funções. Não vou me preocupar com tratamento de erros nem com outros detalhes, mostrarei apenas as funções para comparar:

Conexão ao Banco de Dados

No MySQL:

Abrir a conexão:

$con_my = mysql_connect("localhost:porta", "usuario", "senha");

Quando for usar, selecionar o banco:

mysql_select_db('nomebanco', $con_my);

No PostgreSQL:

Etapa única:

$con_pg = pg_connect("host=127.0.0.1 port=5432 dbname=banco user=usuario password=senha");

Obs.: na conexão já se seleciona o banco a ser usado.

Consultas

MySQL:

$q = mysql_query(“SELECT * FROM tabela”, $con_my);

PostgreSQL:

$q = pg_query($con_pg, “SELECT * FROM tabela”);

Obs.: Veja que a ordem dos parâmetros é invertida.

LIMIT

Aqui temos uma boa diferença entre ambos.

Quando for a forma resumida não há diferença entre ambos. Por exemplo:

SELECT * FROM tabela ORDER BY campo LIMIT 5;

Obs.: Altamente recomendado usar ORDER BY antes de LIMIT, para um retorno coerente e o campo do ORDER BY deve ser o campo chave primparia.

Quando o LIMIT trouxer os dois parâmetros então teremos diferença.

Sintaxe no PostgreSQL:

SELECT lista_de_campos FROM expressão [LIMIT { número | ALL }] [OFFSET inicio]

LIMIT ALL – mesmo que omitir LIMIT.

OFFSET inicio – orienta para que a consulta retorne somente a partir de inicio.

OFFSET 0 – mesmo que omitir OFFSET.

LIMIT 50 OFFSET 11 – Deverá trazer 50 registros do 12 até o 50, caso existam.

Exemplos:

SELECT * FROM cliente ORDER BY codigo LIMIT 2 OFFSET 0;

Irá retornar os registros do 1 e 2.

SELECT * FROM cliente ORDER BY codigo LIMIT 2 OFFSET 1;

Irá retornar os registros do 2 e 3.

SELECT * FROM cliente ORDER BY codigo LIMIT 2 OFFSET 2;

Irá retornar os registros do 3 e 4 (Se existirem).

Ou seja, o primeiro parâmetro do é a quantidade e o segundo o inicial (começando do 0).

Sintaxe no MySQL:

LIMIT [início,] linhas

Retorna o número de linhas especificado. Se o valor início for fornecido, aquelas linhas são puladas antes do dado ser retornado. A primeira linha é 0.

Exemplo:

SELECT * FROM cliente ORDER BY codigo LIMIT 3,2;

O comando acima pede apenas os registros de código 4 e 5, os dois após o 3.

SELECT * FROM cliente ORDER BY codigo LIMIT 3,1;

Aqui retornará 1 registro, de código 4, que é o próximo após o 3.

SELECT * FROM cliente ORDER BY codigo LIMIT 2 , 4;

    Aqui retornará os registros de código 3,4,5 e 6.

No MySQL o início é o primeiro parâmetro e a quantidade é o segundo.

Experimente os exemplos acima num gerenciador dos SGBDs para consolidar o conhecimento (phpmyadmin e phppgadmin).

Replicação no SGBD MySQL

Recriar replicação no MySQL de maneira fácil

http://www.vivaolinux.com.br/dicas/impressora.php?codigo=9040

Replicação no MySQL

An introduction to replication1

How to start replicating - the slave server

Replicação com o MySQL

http://phpbrasil.com/articles/article.php/id/1213

Migrando .DBF para MySQL

No ótimo site Vivaolinux - http://www.vivaolinux.com.br/dicas/verDica.php?codigo=8792

phpMyAdmin

Software para administração web do MySQL, que conta com muitos recursos e tem interface simples de usar.

Site oficial - http://www.phpmyadmin.net/home_page/index.php

Download - http://www.phpmyadmin.net/home_page/downloads.php

Documentação principal - http://www.phpmyadmin.net/documentation/

FAQs - http://www.phpmyadmin.net/documentation/#faq

Doing More With phpMyAdmin: part 1 - http://www.devshed.com/c/a/PHP/Doing-More-With-phpMyAdmin-Part-1/

Doing More With phpMyAdmin: part 2 - http://www.devshed.com/c/a/PHP/Doing-More-With-phpMyAdmin-Part-2/

Conversão de Tipos

Convertendo varchar em date no MySQL

Autor: Fábio Berbert de Paula <fberbert@gmail.com> Data: 23/07/2007

Convertendo varchar em date no MySQL

Peguei uma manutenção de um sistema PHP/MySQL pra fazer e surgiu a necessidade de ordenar determinada tabela pelo campo data, porém pra minha surpresa esse campo era do tipo VARCHAR() ao invés de DATE() ou DATETIME().

A data estava armazenada na tabela no formato "dd/mm/yyyy", exemplo:

SELECT data FROM contas;

+------------+
| data       |
+------------+
| 26/11/2003 | 
| 04/12/2003 | 
| 28/11/2003 | 
| 05/12/2003 | 
| 29/12/2003 | 
+------------+

O problema é que ao mandar ordenar a tabela por data, por ser VARCHAR o resultado não funciona como o esperado:

SELECT data FROM contas ORDER BY data;

+------------+
| data       |
+------------+
| 04/12/2003 | 
| 05/12/2003 | 
| 26/11/2003 | 
| 28/11/2003 | 
| 29/12/2003 | 
+------------+

Isso acontece porque se o campo é texto, ele começa a ordenar da esquerda pra direita em ordem alfanumérica, onde 04/12 é menor que 26/11, o que está errado, visto que em data a gente precisa levar em conta, em ordem de prioridade, ano-mês-dia.

Pra resolver esse problema sem ter de mexer na tabela (o que não tinha permissão pra fazer), use a função str_to_date() do MySQL:

SELECT str_to_date(data, '%d/%m/%Y') AS data FROM contas ORDER BY data;

+------------+
| data       |
+------------+
| 2003-11-26 | 
| 2003-11-28 | 
| 2003-12-04 | 
| 2003-12-05 | 
| 2003-12-29 | 
+------------+

Hmmm, agora sim! A sintaxe da função é:

str_to_date(CAMPO, 'formato armazenado da string')

Maiores informações:

   * http://dev.mysql.com/...#function_str-to-date 

Fonte: http://www.vivaolinux.com.br/dicas/verDica.php?codigo=9000

Referências

- Manual Online do MySQL 4.1 em Português - com opção de busca pelo conteúdo.

http://dev.mysql.com/doc/refman/4.1/pt/index.html

- Manual do MySQL em vários idiomas e em vários formatos para download - http://mysql.org/doc/

- Removendo Duplicidades em MySQL - http://www.dicas-l.com.br/print/20060930.html

Como o MySQL pode facilitar a sua vida

Artigo do Diego Hellas no PHPBrasil

http://phpbrasil.com/articles/article.php/id/1361

Usando o DBDesigner 4

http://www.revistaphp.com.br/print.php?id=160

Store Procedures com Transaction no MySQL

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7177