Qual é a diferença entre o tipo de dados CHAR e o tipo de dados VARCHAR? E o NCHAR e o NVARCHAR?

Uma dúvida comum no desenvolvimento com SQL Server é acerca dos campos String. Encontrei um excelente artigo falando sobre isso: Qual é a diferença entre o tipo de dados CHAR e o tipo de dados VARCHAR? E o NCHAR e o NVARCHAR?.

Primeiro vou explicar a diferença entre o CHAR e o VARCHAR:

* CHAR: Este tipo de dados sofre a ação da collation escolhida para o banco de dados em que foi criado (ou uma collation que pode ter sido especificada na criação da tabela) e armazena a mesma quantidade de caracteres que foram especificados na sua criação, preenchendo com espaços em branco casa haja necessidade. Por exemplo:

CREATE TABLE TB_STRING
(
CAMPO1 CHAR(10)
)

Se fizermos o seguinte INSERT:

INSERT TB_STRING('A')

O campo vai armazenar o valor ‘A’ e também vai armazenar mais nove espaços em branco depois. Por causa desta característica o tipo de dados CHAR é chamado de tipo de dados com tamanho fixo.

* VARCHAR: Este tipo de dados também sobre a ação da collation para o banco de dados em que foi criado (ou uma collation que pode ter sido especificada na criação da tabela) e armazena SOMENTE a quantidade de caracteres que foram especificados na sua criação . Por exemplo:

CREATE TABLE TB_STRING1
(
CAMPO1 VARCHAR(10)
)

Se fizermos o seguinte insert:

INSERT TB_STRING1('A')

O campo vai armazenar o valor ‘A’ SOMENTE, sem colocar espaços em branco depois. Por causa desta característica o tipo de dados VARCHAR é chamado de tipo de dados com tamanho variável.

Uma outra pergunta que sempre me fazem é: quando devo utilizar o CHAR ao invés do VARCHAR uma vez que o CHAR ocupa mais espaço ? A resposta é simples: o tipo CHAR deve ser utilizado quando sabemos de antemão que todos os dados inseridos em determinada coluna não são variáveis como, por exemplo, uma coluna que armazena um código de peça que sempre precisa ter 5 dígitos. Outro fator a ser considerado são as pesquisas feitas utilizando o operador =.

Já o VARCHAR deve ser utilizado quando não sabemos o que vamos armazenar. Um exemplo pode ser o nome do cliente ou razão social que sempre acaba variando.

Quanto ao desempenho é provável que os tipo de dados VARCHAR apresentem uma pequena diferença em relação ao tipo de dados CHAR, principalmente em operações que leiam muitos registros como a criação de índice. Porém esta diferença só é perceptível quando a quantidade de dados é grande e estamos fazendo uma medição correta.

Já os tipos de dados NCHAR e NVARCHAR são análogos aos tipos de dados CHAR e VARCHAR, respectivamente, porém com uma pequena diferença: os tipos de dados NCHAR e NVARCHAR não sofrem ação da collation e sempre gastam dois bytes para armazenar cada caractere.

Comentarios

Documentação PHP

A documentação (ou manual) é a melhor ferramenta, junto com a referência rápida (quick reference), de desenvolvimento. Sempre se aprende e se desenvolve algo novo com as funções que não sabíamos que existia, mas estava lá, esperando que a usássemos para resolver nosso problema. Na maioria dos casos em que se busca a definição de determinada função, seus parâmetros e funcionalidades, é bem melhor do que uma busca em sítios de pesquisa. Sempre vale tê-la. Aproveite, tudo em português:

Comentarios

Caminho físico x caminho virtual para BD Access

Um erro relativamente comum por parte de desenvolvedores ainda sem muita experiênia, e que os leva frequentemente a achar que existe algum problema no servidor, é o caminho de Bancos de Dados Access.

Comumente o usuário tem, em sua máquina local, um banco no caminho…

c:\inetpub\wwwroot\bd\meubanco.mdb

Funciona em sua máquina local, e quando a página que usa o banco é enviada para o servidor… “A página não pode ser exibida”. A conclusão precipitada, muitas vezes, é que “há um problema no servidor, porque a página está correta, e roda em minha máquina“.

O desenvolvedor deve usar sempre um Caminho Virtual para não ter problemas se houver alguma mudança na configuração do servidor, ou se mudar de provedor e ainda para manter a compatibilidade, usando o mesmo código em seu servidor local e no servidor do produção (o do provedor). Se criou uma pasta “/data” e para lá enviou “meubanco.mdb” deverá usar, como caminho…

Server.MapPath("\data\meubanco.mdb")

A função Server.MapPath retorna (ou ‘traduz’) o caminho físico correspondente ao caminho virtual informado. No servidor local, como exempleficado, um…

Response.Write Server.Mappath("\") vai gerar…

c:\inetpub\wwwroot\

… e provavelmente será diferente no servidor do provedor. Assim é mantida a compatibilidade, não sendo necessário alterar o código para fazer o ‘upload’.

Comentario (1)

Sistema Monitor

Quantos são e quem são os usuários online?
Qual o tempo médio de navegação por usuário?
Quais são os horários de maior atividade?
Qual o máximo de usuários navegando simultaneamente?

Os procedimentos utilizados no Sistema Monitor aqui descrito não são necessariamente os melhores em código ou performance. São, no entanto, o que considerei (segundo meu próprio julgamento) ao alcance da maioria dos usuários. Aqueles que esperam apenas “código mastigado” dificilmente farão proveito desse artigo. Um outro detalhe importante é que estou fazendo uso do Global.asa. Mais tarde vou escrever uma adaptação para quem não pode utilizar global.asa (normalmente em hospedagem gratuita).

O primeiro ponto a ser abordado será a contagem, pura e simples, dos usuários online. Isso é possível através das “Subs” Session_OnStart e Session_OnEnd (no global.asa), conforme descrito abaixo. Inicialmente você deverá ter definido uma variável Application no Application_OnStart

Sub Application_OnStart
    Application(”Max”) = 0
    Application(”OnlineVisit”) = 0
End Sub


Sub Session_OnStart
    Application(”OnlineVisit”) = Application(”OnlineVisit”) + 1
    if Application(”OnlineVisit”) > Application(”Max”) then
         Application(”Max”) = Application(”OnlineVisit”)
    End if
End Sub


Sub Session_OnEnd
    Application(”OnlineVisit”) = Application(”OnlineVisit”) – 1
End Sub


Session_OnStart é executada a cada vez que uma sessão é iniciada, o navegador é “instanciado”. A Session_OnEnd é executada a cada encerramento de sessão, e isso pode ocorrer de 2 maneiras.

a)     Através de Session.Abandon. Se existe um botão “fim” e o desenvolvimento foi correto, haverá uma “chamada” a Session.abandon. O navegador será fechado, ou haverá redirecionamento para página padrão…

b)     Não ocorreu nenhum “request” nos últimos “n” minutos, sendo “n” o valor de Session.TimeOut. é muito utilizado por quest?de segurança, e o valor padrão é 20 (minutos). Se o usuário simplesmente fechar o navegador (como normalmente acontece), a sessão expirará pelo tempo, e Session_OnEnd será executada.

Até aqui podemos saber, com uma pequena margem de erro (podemos até mesmo desconsiderar, uma vez que o s servidor precisa tratar a sessão até sua expiração) o número de usuários online, mas ainda não podemos saber QUEM são eles.

Esse é o segundo ponto, e para isso vamos utilizar uma tabela de um banco de dados, lembrando que não é necessariamente a melhor opção quanto à performance, mas sim quanto ao entendimento, à didática.

Vamos identificar o usuário pelo Session.SessionID, gerado a cada sessão. É um identificador único, podendo ser utilizado como chave primária, diferente do IP, que pode ser compartilhado. E ainda há a possibilidade, muito comum, de um mesmo usuário, em uma mesma máquina, abrir o mesmo site várias vezes. Por essa razão, não podemos utilizar o IP como identificador do usuário.

Essa tabela contará, para nosso simples exemplo, com um campo SessionID (numérico), e outro DtLastMov (Data&Hora).

Uma vez que o usuário faça o acesso à primeira página (e isso deve ser tratado, pois o usuário já tarimbado pode ir diretamente à página que deseja), seu SessionID deve ser inserido, juntamente com a Data & Hora. A cada novo request (mudança de página ou “submit” de formulário são casos típicos) o registro com seu SessionID deve ser atualizado com now().

Uma vez que Session_OnStart e Session_OnEnd nos informam o número de usuários online, se fizermos um select to tipo…

 sql = “SELECT TOP ” & Application(OnlineVisit) & ” * FROM tabela ORDER BY DtLastMov DESC”

… saberemos exatamente QUEM está online! Um campo IP pode ser utilizado ou USER (para sites que cadastram usuários), ou mesmo a combinação de ambos. é possível saber quem são os usuários logados e quem são os visitantes.

Se somarmos “n” minutos, sendo n o valor de Session.TimeOut ao último movimento de cada usuário podemos ter o tempo que cada um ficou online.

Vamos ver como podemos trabalhar com soma e subtração em campo Data & Hora. Utilizaremos, inicialmente, a função now()

Now() + 1 = Data&hora atual + 1 dia
Now() + (1/24) = Data&hora atual + 1 hora

Now() + (1/24/60) = Data&Hora atual + 1 minuto

Com DateDiff(”n”, DataHora1, Datahora2) calculamos o intervalo, em minutos, de duas variáveis “datahora”. é importante que os segundos serão desconsiderados. Por exemplo:

DateDiff(”n”,d1, d2) retornará 3.

Uma vez calculado o tempo individual, podemos obter facilmente a média (um pouco de matemática, não mais ASP), além de detalhes como horas de maior tráfego e o que mais o desenvolvedor achar por bem. é importante lembrarmos que o ASP é tão din⭩co quanto nós pudermos ser. A limitação é nossa própria criatividade e capacidade de analisar dados. O número máximo de visitantes já está sendo tratado em Application(”Max”), no Global.asa, e para que o proposto acima funcione corretamente é necessário tratar cada movimento do usuário. A utilização do Global.asa e as duas variáveis Application são suficiente para saber quantos são os visitantes do momento. A implementação do QUEM tem um certo custo e é necessário que cada movimento do usuário seja rastreado. Você poderá, assim, tratar seus usuários cadastrados e visitantes…

Vimos com um bom nível de detalhamento a teoria para a criação de um sistema monitor. Qualquer esclarecimento maior, ou dúvida quanto à implementação, basta enviar-me um e-mail.

Elildo Mancebo Reis
elildo@aspecto.net
www.aspecto.net

Comentarios

Enviando mensagens com o PHPMailer

O PHPMailer é um componente de envio de e-mail para servidores que exigem autenticação ou para um desenvolvedor que deseje configurações mais avançadas para a rotina de e-mail pelo php que o a função mail() não possua. É importante percebermos que um servidor que exige autenticação o faz por razões de segurança, para que o mesmo não caia nas listas negras caracterizado como um servidor de Spams.

A seguir, um exemplo de código para envio de e-mail pelo PHPMailer (para páginas de Contato ou Fale Conosco, por exemplo).

Obs: O ideal é que você baixe o PHPMailer e coloque no seu próprio servidor, deixando com que o seu domínio sempre tenha independência e rapidez no envio de mensagens através das suas páginas.

———-

<?php
require_once("phpmailer/class.phpmailer.php");

$mail = new PHPMailer();
$mail->IsSMTP(); // send via SMTP
$mail->Host = "mail.seudominio"; //seu servidor SMTP
$mail->SMTPAuth = true; // 'true' para autenticação
$mail->Username = "usuario@seudominio"; // usuário de SMTP
$mail->Password = "senhaxxx"; // senha de SMTP
$mail->From = "de@seudominio";
//coloque aqui o seu correio, para que a autenticação não barre a mensagem
$mail->FromName = "remetente";
$mail->AddAddress("email@destinatario","Nome do Destinatario ");
$mail->AddAddress("email@destinatario"); // (opcional) só o envio pelo email
$mail->AddReplyTo("email@destinatario.copia","Nome do Destinatario com cópia");
//aqui você coloca o endereço de quem está enviando a mensagem pela sua página

$mail->WordWrap = 50; // Definição de quebra de linha
$mail->AddAttachment("/caminho/do/anexo/no/servidor.ext"); // (opcional) anexos
$mail->AddAttachment("/caminho/do/anexo/servidor.ext","nome_do_anexo.ext"); // (opcional) mais anexos
$mail->IsHTML(true); // envio como HTML se 'true'

$mail->Subject = "Assunto da mensagem ";
$mail->Body = "Conteúdo da mensagem HTML ";
$mail->AltBody = "Para mensagens somente texto";

if(!$mail->Send())
{
echo "Mensagem não enviada<br />";
echo "Mailer Error: " . $mail->ErrorInfo;
} else
{
echo "Mensagem enviada";
}
?>

———-

O código-fonte está em http://noticias.aspecto.net/php/phpmailer.php.txt

Relacionados:

Comments (13)

« Anteriores Next Page » Next Page »