Para alguns o php morreu

PHP é uma linguagem de script do lado do servidor. Foi criado em 1994 por Rasmus Lerdorf,  roda em servidores da web do mundo enteiro, como Apache e Nginx, pode ser incorporado em marcação HTML ou HTML5. Rescentemente a linguagem PHP festejou os seus 20 anos de idade. Porém a uma má reputação, frequentemente “criticada” por ser muito permissiva, demasiado lenta ou ainda porque é suportada por uma comunidade que não é suficientemente profissional, sendo assim fiz uma pesquisando na internet para ver e fazer testes local por curiosidade consgui este posts nos site abaixo citados que me chamaram muita a aténção, não vou entrar em detalhes sobre a comparação pois eu também utilizo as todas as tecnologias citadas e confesso que todas elas tem as suas VANTAGENS.

  1. https://thinkmobiles.com/blog/php-vs-nodejs/
  2. https://www.geeksforgeeks.org/php-vs-node-js/
  3. https://belitsoft.com/php-development-services/php7-vs-nodejs

O php continua sendo muito utilizado em muitos projetos mundo afora e continua sendo poderoso e ótimo para programar, eu particularmente aprendi muito os conceitos de programação graças ao php em um momento en que os dataSource do delphi fazian-me arancar mus cabelos. Vejo é escuto muitas pessoas competirem com “qual/quem é o melhor?” e “qual/quem é o moribundo o ximbo?”, toda a vez que surge uma nova tecnologia,  a galera fica desesperada para que ela seja a “ferramenta definitiva”, matando tudo que tem em volta. Foi assim quando veio o ruby, nossa como era formidavel gems cmd e promto no entando o seu sucesso foi tão espontaneo que nem deu tempo de aprender.  Pois a bola da vez parece ser o node, vale lembrar que

Node.js não é o melhor sistema do lado do servidor’ 
admitiu Ryan Dahl em sua entrevista (2017)”

O PHP tem suas  “falhas e problemas” mas em 2009 a versão 5.3 resolveu a maioria dos “bugs tradicionais” encerrando de vez o assunto, por outro lado ainda escuto pessoas desinformadas dizendo que php não tem try catch,  Bloco try/catch serve para tratamento de exceções, tratamento de códigos que podem não ser totalmente atendidos e gerarem alguma exceção/erro. Além disso também temos um bloco chamado finally (PHP 5.5 ou superior), que fornecem instruções do que deve ser executado após o try/catch (normalmente liberação de recursos). Caso uma exceção seja capturada, o finally será executado somente após o termino das instruções fornecidas no catch. Caso nenhuma exceção seja gerada, o finally será executado após as instruções fornecidas no try.

 

try {
    //Esse código precisa de tratamento pois pode gerar alguma exceção
    $variavel = Coisa::pegarRecurso();
    if ($variavel->executarCoisa())
        throw new \Exception('Erro: ' . $variavel->pegarErro());
} catch (\Exception $e) {
    var_dump($e->getMessage());
} finally {
   $variavel->liberarRecurso();
}

 

Dizer que tem erros ou indicar que é fracamente tipada,  bom isso depende da esperiencia de cada programador, uns saberão o que fazer outros culparam a linguaguem ou podem até trocar por outro como ja tinha dito isso dependera do programador. muitos sites criados em PHP são lento e isso não é gerado pelo código PHP mas, pelas relações entre as aplicações e os seus ambientes de execução. A maior parte dos sites em PHP utilizam bases de dados alojada num outro servidor e não otimizam as suas queries SQL “consultas sql devem ser otimizadas sempre”, Tudo são ações que originam latência: de rede, de escrita em disco… Sem contar com as falhas de otimização.  Um exemplo corrente: as extensões, “pluguins” de WordPress, criadas em PHP, coisa que eu particularmente odéio. Elas tendem a fazer consultas a outros servidores ou procurar variadíssimos dados a cada execução de cada internauta. Isso aumenta consideravelmente o tempo de carregamento dos sites, sem que PHP possa fazer nada ou seja “culpado”.  Ja o PHP 7 é baseado no mecanismo PHPNG que acelera os aplicativos PHP mais do que o interpretador anterior do PHP ( Zend Engine 2.0 ). Graças ao PHPNG, seus aplicativos apresentam desempenho até 2x mais rápido e 50% melhor consumo de memória do que o PHP 5.6.

framework-php7

O PHP é mais popular e mais fácil de aprender, suporta uma quantidade significativa de tecnologias e técnicas de programação profissional. Existem muitas fontes onde você pode obter assistência e ajuda, e o processo de implementação é muito mais fácil do que as outras linguagens e para finalizar deixo uma estatistica que comprova a vida do PHP continua bem ativa e não morreu como se imagina.

A linguagem não está morta!, até, tem várias vantagens sérias relativamente a uma das problemáticas mais interessantes com a qual nos confrontamos hoje em dia: a escalabilidade das aplicações e das infraestruturas que as alojam, espero que tenham a ocasião de considerar PHP com uma nova visão, sem ideias pré-concebidas!

 

Em 2019 o php ainda esta em 7,9 % da internet

esta

Fonte: https://w3techs.com/technologies/overview/programming_language/all. 2019

 

Releases da linguagem

https://www.php.net/index.php#id2019-05-30-3

 Dayle Rees (colaborador e desenvolvedor do Laravel Framework ):Por muito tempo o PHP foi alvo de muitas piadas de linguagem, mas eu sinceramente sinto que está se tornando não apenas uma linguagem popular, mas também poderosa. PHP7 é ótimo.

Anúncios

Você usa Statement ou PreparedStatement?

Um belo dia fui fazer um teste em uma empresa na qual utilizavão o java com linhuagen de desenvolvimento

depois do teste recebi um e-mail e persebi que ainda falta-me muito para chegar a em considerar programador java ma uma dos quesito me chamou muito a atenção

– Quando for implementar algo utilizando JDBC puro, estude antes a respeito de SQL INJECTION. O JDBC tem tratamento específico para isto. nota do avaliador

a minha conclusão foi essa

Statement

não e seguro e vunerabel a pratica chamada SQL injection.

Vejam um exemplo:


String sql   = "select * from user where username='" 
+ username +"' and password ='" + password + "'";
stmt   = conn.createStatement();
rs     = stmt.executeQuery(sql);
 if (rs.next())
   {
   loggedIn = true ;
  out.println(" Usuário Logado com  sucesso.");
 } else {
    out.println("Usuário Senha não encontrado.");

 }

A principio nada de errado ai, mas se alguém colocar no campo
usuário isso admin’ OR ‘1′=’1 o comando select final ficaria algo
assim:


select * from user where username=’admin’ OR ‘1′=’1′ and password=” 

O resultado desse comando retorna o usuário admin, ou o primeiro
usuário cadastrado no banco que e geralmente o que tem SID root,
imaginem o estrago que isso pode acarretar.
Outro exemplo:

String sql = "select * from user where estado='RS'
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
    	out.println("Usuário:" + rs.getString(1));
}

Bem simples esse select né, mas se o usuário ao invés de
digitar ‘RS’, digitar ‘or true. Seria a mesma coisa que se o
select fosse ‘Select * from user’ Traz tudo!!! Agora pra
resolver esse tipo de coisa você pode usar
PreparedStatement ao invés de Statement.
Exemplo:


String select = "SELECT * FROM User WHERE username = ? ";
PreparedStatement 
prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, username);
ResultSet rs = prepStmt.executeQuery();

O SQL Injection não tem vez contra o PreparedStatement, que
além de deixa a aplicação mais “segura”,  também melhora a
performance da mesma.

eu so sei isso mais eu me divirto 🙂

Zerar campo Identity no SQL Server

Se você precisa zerar um campo tipo identity no SQL Server, é possivel fazer isso usando o comando DBCC CHECKIDENT. Existem três formas de usar este comando que são:

1. DBCC CHECKIDENT (NomeTabela, NORESEED)
Simplesmente será retornado o valor atual do campo identity

2. DBCC CHECKIDENT (NomeTabela)
Será retornado o valor atual do campo identity e se for necessário fazer algum ajuste nos valores, estes ajustes serão feitos automaticamente. Por exemplo: Se o valor do campo identity estiver menor que o número total do contador de registros da tabela.

3. DBCC CHECKIDENT (NomeTabela, RESEED, 0)
Desta forma o valor atual do campo identity será alterado para o valor informado no tereceiro parametro (neste caso zero). Quando se cria uma tabela e nunca foi inserido nenhum registro nela, o valor inicial que a função retorna é NULL, mas se você quiser zerar o valor terá que passar o valor 0 (zero) como parametro. Assim o próximo registro a ser inserido será o valor 1.

Diferenças em @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT

@@IDENTITY, SCOPE_IDENTITY() e IDENT_CURRENT() são funções similares onde retornam o último valor inserido sobre a coluna IDENTITY de uma tabela. Porém, é preciso ficar atento pois dependendo do escopo e da sessão onde são chamadas, podem retornar valores diferentes do esperado.

USE MAQUINA
GO
CREATE TABLE ATABELA1(
TB_id  int IDENTITY(1,1)PRIMARY KEY,
TB_NOME varchar(20) NOT NULL)

INSERT ATABELA1 VALUES (‘PEQUENA’)
INSERT ATABELA1 VALUES (‘MACNAMARA’)
INSERT ATABELA1 VALUES (‘PETRONIO’)

SELECT * FROM ATABELA1

— Registros em ATABELA1
TB_id   TB_NOME
——————————-
1      PEQUENA
2      MACNAMARA
3      PETRONIO

CREATE TABLE  ATABELA2(
TB2_id  int IDENTITY(100,5)PRIMARY KEY,  TB2_NOME varchar(20) NULL)

INSERT ATABELA2 (TB2_NOME) VALUES (‘PUNK ROCK’)
INSERT ATABELA2  (TB2_NOME) VALUES (‘ROCK N´ROLL’)
INSERT ATABELA2 (TB2_NOME) VALUES (‘HEAVY METAL’)

SELECT * FROM ATABELA2

— Registros em ATABELA2
TB2_id  TB2_NOM
—————
100   PUNK ROCK
105   ROCK N´ROLL
110  HEAVY METAL

/* Cria uma trigger que insere um registro em ATABELA2 quando um registro é inserido em ATABELA1 */
CREATE TRIGGER T1_trig ON ATABELA1  FOR INSERT AS
BEGIN
INSERT ATABELA2 VALUES (”)
END

@@IDENTITY

Apesar de @@IDENTITY ser conhecido como uma variável global, ele é isolado por sessão, ou seja, retorna o último valor identity inserido em qualquer tabela desde que seja na sessão corrente. Entenda sessão como sendo uma conexão.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para @@IDENTITY */
INSERT ATABELA1 VALUES (‘ROSELI KHOL’)
SELECT @@IDENTITY AS [@@IDENTITY]
— Retorna 115 – valor identity inserido sobre a tabela ATABELA2
GO

O problema aqui é que a tabela ATABELA1 possui um trigger que também gera insert em outra tabela com identity (ATABELA2). O valor de @@IDENTITY é alterado devido ao insert realizado pelo trigger, desta forma o valor que será retornado não é o identity para ATABELA1, mas sim o identity para ATABELA2.

IDENT_CURRENT()

IDENT_CURRENT não é limitado por escopo ou sessão, mas sim por uma tabela em específico. IDENT_CURRENT retorna o último valor identity inserido em uma determinada tabela em qualquer sessão ou escopo.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para IDENT_CURRENT */
INSERTATABELA1 VALUES (‘ROSELI KHOL‘)
SELECT IDENT_CURRENT(‘ATABELA1’) AS [IDENT_CURRENT
] — Retorna 4 – valor identity inserido sobre a tabela ATABELA1
GO

Se estiver testando isso, irá parecer que funcionou, devolverá o valor identity para a tabela ATABELA1. O problema é que o IDENT_CURRENT não está preso a uma sessão, então se estiver ocorrendo inserções simultâneas sobre a tabela ATABELA1, o valor que ele poderá estar retornando pode não ser o da sua inserção.

SCOPE_IDENTITY()

Assim como @@IDENTITY, SCOPE_IDENTITY() retornará o último valor identity inserido em qualquer tabela na sessão corrente.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para SCOPE_IDENTITY */
INSERT ATABELA1 VALUES (‘ROSELI KHOL’)
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
— Retorna 4 – valor identity inserido sobre a tabela ATABELA1
GO

Entretando, SCOPE_IDENTITY é limitado a um escopo e com isso retornará o último valor identity inserido dentro do escopo de um determinado batch. Como o trigger é considerado um outro escopo, o valor de identity da tabela ATABELA1  será devolvido corretamente

Referências:  http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=59


O uso de stored procedures em Mysql

A maior vantagem do uso de stored procedures é a redução de tráfico na rede. Já que as stored procedures são executadas pelo SGDB na máquina servidora de banco de dados,Stored procedures aumentam a performance de outra forma também. Você pode utilizar querys para fazer muitas das coisas que podem ser feitas com stored procedures mas uma query tem uma grande desvantagem. Cada vez que a aplicação cliente envia um comando SQL para o servidor o comando tem que ser “parsed”, ou seja, analisado gramaticalmente, submetido ao optimizador para formulação de um plano de execução. Stored procedures são analisadas , optimizadas e armazenadas em uma forma executável no momento em que são adicionadas ao banco de dados.
Exemplo:

— DELETA A PROCEDURE SE EXISTIR
DROP PROCEDURE IF EXISTS `axelalexander`.`sp_insere_artcategoria` $$
— CRIA A PROCEDURE
CREATE PROCEDURE `axelalexander`.`sp_insere_artcategoria` ( categoria VARCHAR(20)
)
BEGIN
— SE A VARIAVEL NÃO FOI IGUAL NULO FAZ O INSERT
IF categoria IS NOT NULL THEN
INSERT INTO artcategoria (Categoria ) VALUES (categoria);
END IF;
END $$
DELIMITER ;
— FIM DA PROCEDURE

JavaScript – Controladores de eventos

onAbort
Executa um código JavaScript quando o usuário interrompe o carregamento de uma imagem, por exemplo, com um clique no botão Parar. Deve ser usado com o objeto imagem (IMG) de HTML.
Exemplo:

<img src=”img/foto”/>

onBlur
Executa um código JavaScript quando um elemento, janela ou quadro, perde o foco. Usado para Button, Checkbox, FileUpload, Layer, Password, Radio, Reset, Select, Submit, Text, Textarea, window, na forma onBlur=”verificarNome(n)“, onde “algumaCoisa” é uma função ou código de JavaScript ou adicionando eventos diretamente no javascript como mostrado no exemplo

Exemplo

Nome: <input id=”nome” name=”nome” type=”text” placeholder=”Nome ….” />

var imput= document.getElementById("nome");
imput.addEventListener("blur", function( event ) {
  event.target.style.background = "";    
}, true); 

function verificarNome(e){ 
alert(" Valor : "+ e.target.value ) 
}

Nome: <input id=”nome” name=”nome” type=”text” onBlur=”verificarNome(e)” placeholder=”Nome ….” />

Onde “verificarNome(n)” é uma função (a ser desenvolvida) para verificar se o usuário inseriu um nome válido.

onChange Executa um código JavaScript quando um campo perde o foco e tem seu valor modificado. Usado para FileUpload, Select, Text, Textarea, na forma onChange=”algumaCoisa()”, onde “algumaCoisa é uma função ou código de JavaScript. Exemplo:

Nome (1): <input id="nome1" name="nome1" type="text" onChange="algumaCoisa(e)" placeholder="Nome ...." />

 

const selectElement = document.querySelector('#nome1');

selectElement.addEventListener('change', (event) => {
  const result = `Seu nome ${event.target.value}`;
});
// ou 
function algumaCoisa(e){ 
    alert(" Valor : "+ e.target.value ) 
}

Onde “verificarNome(n)” é uma função (a ser desenvolvida) para verificar se o usuário inseriu um nome válido.

onClick Executa um código JavaScript quando um objeto é clicado. Usado para Button, document, Checkbox, Link, Radio, Reset, Submit, na forma onClick=”algumaCoisa“, onde “algumaCoisa” é uma função ou código de JavaScript. Exemplo 1:

<button>click – me </button>

var button = document.querySelector("button");
function once() {
   console.log("Done.");
   button.removeEventListener("click", once);
}
button.addEventListener("click", once);



Se o usuário clica no botão, aparecera a palabra “Done no console do navegador”

<button onclick=”calcular(9)”>click – me </button>

outro exemplo  seria quando Ao clicar no botão, é chamada a função “calcular(a)

function calcular(a ) {
   let b = 9
   let resto = a + b
   console.log("Resultado : " , resto);
}

onDblClick Executa um código JavaScript quando um duplo clique é dado no objeto. Usado para document, Link, Áreas de bloqueio ou imagens, na forma onDblClick=”algumaCoisa“, onde “algumaCoisa” é uma função ou código de JavaScript. Exemplo:

<p>Clique duas vezes em qualquer lugar neste exemplo.</p>
<p id="log"></p>
let log = document.getElementById('log');

document.ondblclick = logDoubleClick;

function logDoubleClick(e) {
  log.textContent = `Posição: (${e.clientX}, ${e.clientY})`;
}

onDragDrop Executa um código JavaScript quando um objeto é arrastado para a janela do navegador. Usado para window, na forma onDragDrop=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.

window.addEventListener("dragdrop", testfunc, false);

function testfunc(event) {
    alert("dragdrop!");
    event.stopPropagation();
}

atualmente obsoleto no HMT5 porém a um nova implementação https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API

onError Executa um código JavaScript quando um erro ocorre no carregamento de uma janela ou imagem. Usado para Image, window, na forma onError=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.  O evento só ocorre em caso de erro de sintaxe no código ou erro em tempo de execução do mesmo. Não reporta erros do navegador. Se é forçado para nulo, suprime mensagens de erro. Exemplo 1:

<img src="imagenotfound.gif" onerror="this.onerror=null;this.src='imagefound.gif';" />
window.onerror = function (msg, url, lineNo, columnNo, error) {
  var string = msg.toLowerCase();
  var substring = "script error";
  if (string.indexOf(substring) > -1){
    alert('Script Error: See Browser Console for Detail');
  } else {
    var message = [
      'Message: ' + msg,
      'URL: ' + url,
      'Line: ' + lineNo,
      'Column: ' + columnNo,
      'Error object: ' + JSON.stringify(error)
    ].join(' - ');

    alert(message);
  }

  return false;
};

 

Exemplo 2:

window.addEventListener('error', function(event) { /*seu cpdigo aqui */ })

 

onFocus Executa um código JavaScript quando o objeto recebe o foco. Usado para Button, Checkbox, FileUpload, Layer, Password, Radio, Reset, Select, Submit, Text, Textarea, window, na forma onFocus=”algumaCoisa“, onde “algumaCoisa” é uma função ou código de JavaScript. Exemplo:

<input type="text" value="click aqui">
let input = document.querySelector('input');

input.onfocus = inputFocus;

function inputFocus() {
  input.value = 'O focus esta aqui';
}

Onde “inputFocus(n)” é uma função para verificar se um nome válido existe no campo toda vez que esse campo recebe o foco.

 

onKeyDown
Executa um código JavaScript quando uma tecla é pressionada. Usado para document, Image, Link, Text, Textarea, na forma onKeyDown=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:

<input>
<p id="log"></p>
const input = document.querySelector('input');
const log = document.getElementById('log');

input.onkeydown = logKey;

function logKey(e) {
  log.textContent += ` ${e.code}`;
}

 

onKeyPress
Executa um código JavaScript quando o usuário pressiona ou mantém pressionada uma tecla. Usado para document, Image, Link, Text, Textarea, na forma onKeyPress=”algumaCoisa“, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:

Depreciado
Este recurso não é mais recomendado. Embora alguns navegadores ainda possam suportá-lo, ele já pode ter sido removido dos padrões relevantes da Web, pode estar em processo de eliminação ou só pode ser mantido para fins de compatibilidade. Evite usá-lo e atualize o código existente, se possível; veja a tabela de compatibilidade na parte inferior desta página para orientar sua decisão. Esteja ciente de que esse recurso pode deixar de funcionar a qualquer momento.

 

onKeyUp Executa um código JavaScript quando o usuário libera uma tecla que foi pressionada. Usado para document, Image, Link, Text, Textarea, na forma onKeyUp=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript. Exemplo:

<input>
<p id="log"></p>
const input = document.querySelector('input');
const log = document.getElementById('log');

input.onkeyup = logKey;

function logKey(e) {
  log.textContent += ` ${e.code}`;
}

onLoad
loadevento é acionado no final do processo de carregamento do documento. Neste ponto, todos os objetos no documento estão no DOM e todas as imagens, scripts, links e subquadros terminaram o carregamento, executa um código JavaScript quando o navegador termina o carregamento de uma janela, de todos os quadros dentro de um FRAMESET,  na forma onLoad=”load()“, onde “load” é uma função ou código de JavaScript.

Exemplo 1:

<!doctype html>
<html>
  <head>
    <title>onload test</title>
    // ES5
    <script>
      function load() {
        console.log("load event detected!");
      }
      window.onload = load;
    </script>
    // ES2015 
    <script>
      const load = () => {
        console.log("load event detected!");
      } 
      window.onload = load; 
    </script>
  </head>
  <body>
    <p>The load event fires when the document has finished loading!</p>
  </body>
</html>
window.onload = function() {
  init();
  doSomethingElse();
};

var load = function() {
    console.log("load event detected!");
} 

var doSomethingElse = function() {
    console.log("load event detected!");
} 

 

onSelect
Executa um código JavaScript quando o usuário seleciona um texto em uma caixa. Usado para Text, Textarea, na forma onSelect=”logSelection()“, onde “logSelection” é uma função ou código de JavaScript.

<textarea>Tente selecionar algum texto neste elemento.</textarea>
<p id="log"></p>
function logSelection(event) {
  const log = document.getElementById('log');
  const selection = event.target.value.substring(event.target.selectionStart, event.target.selectionEnd);
  log.textContent = `Selecionado: ${selection}`;
}

const textarea = document.querySelector('textarea');
textarea.onselect = logSelection;

 

onSubmit
Executa um código JavaScript quando o usuário clica o botão Submeter de um formulário. Usado para Form, na forma onSubmit=”algumaCoisa“, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:

<form id="form">
  <p id="error" hidden>Por favor, preencha todos os campos.</p>

  <label for="city">City</label>
  <input type="text" id="city" required>

  <button type="submit">Submit</button>
</form>
<p id="thanks" hidden>Seus dados foram recebidos. obrigado!</p>
const form = document.getElementById('form');
const error = document.getElementById('error');
const city = document.getElementById('city');
const thanks = document.getElementById('thanks');

city.oninvalid = invalid;
form.onsubmit = submit;

function invalid(event) {
  error.removeAttribute('hidden');
}

function submit(event) {
  form.setAttribute('hidden', '');
  thanks.removeAttribute('hidden');

  // For this example, don't actually submit the form
  event.preventDefault();
}

 

onUnload
Executa um código JavaScript quando o usuário sai da janela. Usado para window, na forma onUnload=”algumaCoisa”, onde “algumaCoisa” é uma função ou código de JavaScript.
Exemplo:

<iframe src="child-frame.html"></iframe>
window.addEventListener('unload', function(event) {
   console.log('Terminar.');
});

 

em fim ainda a vários outros eventos que não foram citados neste post, e por ultimo deixo os link da MDN o melhor lugar para se aprender JS.

https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event

O PostgreSQL

O PostgreSQL é um poderoso sistema gerenciador de banco de dados objeto-relacional de código aberto.  Tem mais de 15 anos de desenvolvimento ativo e uma arquitetura que comprovadamente ganhou forte reputação de confiabilidade, integridade de dados e conformidade a padrões.  Roda em todos os grandes sistemas operacionais, incluindo GNU/Linux, Unix (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), e MS Windows. É totalmente compatível com ACID, tem suporte completo a chaves estrangeiras, junções (JOINs), visões, gatilhos e procedimentos armazenados (em múltiplas linguagens).  Inclui a maior parte dos tipos de dados do ISO SQL:1999, incluindo INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL, e TIMESTAMP.  Suporta também o armazenamento de objetos binários, incluindo figuras, sons ou vídeos.  Possui interfaces nativas de programação para C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC, entre outros,

http://www.softwarepublico.gov.br/i-encontro-spb

coneça neste link Portal do Software Público Brasileiro os projetos desenvolvido utilizando o postgreSQL

postgres

http://www.postgresql.org.br