PplWare Mobile

Ter o apelido “Null” pode dar-lhe problemas!

                                    
                                

Este artigo tem mais de um ano


Autor: Andreia de Almeida


  1. nfvp says:

    “Null” != Null

  2. LG says:

    E se o meu nome fosse Marco ‘; DROP TABLES *’ ?

  3. Rui LUX says:

    oh valha-me nossa senhora…
    NULL é uma indefinição.. um valor não definido.. que não se sabe. (e não é igual a string vazia!)
    por outro lado.. uma string “NULL” é um “texto” bem definido.. com as letras N U L L …
    portanto, nunca o valor “NULL” vai ser tratado como o NULL usado nas bases de dados.. tal como já dito.. “NULL” não é igual a NULL

    • M.Manuelito says:

      É isso mesmo Rui LUX, até eu que não percebo nada de programação sei isso 🙂

    • pfbatista says:

      Errado, experimenta efectuar um EXEC() duma string composta, num SP em SQL server… vais ter uma surpresa

      • Rui LUX says:

        só uso Oracle.. por isso não posso comentar.. mas se em SQL Server “NULL” e null.. são confundidos.. então fico muito contente de já não usar SQL Server há mais de 10 anos 😉

      • Rui LUX says:

        o problema aí não é do SQL Server.. é do programador.. (..como de costume 😀 )
        NUNCA se deve (ou é de evitar a todo o custo) usar strings para “montar” queries.. sejam SELECTs.. ou UPDATES, DELETES.. as queries devem ser FIXAS e usar BIND VARIABLES. tipo.. SELECT * FROM tbl WHERE col = ?; desta forma… nunca um “NULL” string vai ser confundido com um NULL real.. nem vai ser possivel fazer SQL injection.. tipo ” ‘a’ or 1 = 1;” .. ou ” 1; drop table blablabla.. ..”

    • Roque says:

      em java , um resultset que tenha campos a null na base de dados , os campos veem com valor “null” no seu conteudo … e como é óbvio tem se ser validado ..
      exemplo :
      if (colValue.equals(“null”))
      continue;

      ” até eu que percebo alguma coisa de programação sei isso”

      • Rui LUX says:

        o teu java deve ser especial.. 😀
        o “meu” java tem isto.. e claro.. null sem aspas:
        if ( value.isEmpty() || value.equals(null) ) {

        }

        • Bruno says:

          Podes dominar o Oracle, mas de Java não deves ser grande entendido.
          value.equals(null) -> Nunca é verdadeiro, NUNCA!!!!
          só assim:
          value==null

          • Bruno says:

            Pequena explicação para não ficares a queimar os neurónios:
            Se “value” é um objeto e “equals” um método desse objeto, gostava de saber que “jvm” usas que chama um método de um objeto que é(ou pode ser) null, porque caso seja null, rebenta logo uma excepção.

          • Rui LUX says:

            É um facto: Eu de java percebo pouco. Ponto. Mas volta e meia tenho de olhar para código java.. Para ver o que lá andam a fazer.. Deves ter razão.. Amanhã vou ver se me lembro se perguntar lá aos java “experts” o porquê do value.equals(null)

          • Rui LUX says:

            Bruno.. esta foi a explicação que me deram (relativamente ao código que eu coloquei aqui): os métodos “isEmpty” e “equals” estão overriden.. e o que fazem é, neste caso (object value da class xpto..), é verificar uma X propriedade do objecto e ver se realmente está a null ou se está vazia.. a tal propriedade X (ou lá qual ùe o nome).. não o objecto em si. lá está.. para mim que não sou expert java.. isto faz sentido.. Bruno, tb faz sentido para ti?

          • Bruno says:

            O método equals deve estar reescrito, claro, tal como o HashCode, mas mesmo assim não faz sentido. Se o resultSet retornar um Null, pergunta aos “experts” como é que chamam o método “equals” de um objeto null.

            Quando reescrevemos o equals, a primeira coisa que se faz é verificar se o objeto recebido é null e retornar false.

            value==null -> compara o endereço de memória. Se for null não aponta para nada.

            value.equals(null) -> Compara objetos. Estão a tentar verificar se o value é null ???? Se fôr, reventa logo, porque estão a chamar um metodo de um objeto null.

          • Rui LUX says:

            pahh.. rebentar não rebenta.. se não já alguém tinha reportado o bug.. não vou estar a melgar mais os gajos do java.. já estão a olhar para mim de lado por estar a fazer perguntas sobre o código deles 😀 hehe.. concluindo.. isso é lá com eles.. da minha parte, o que posso dizer é que é Oracle (tal como em todas as bds.. espero eu), um NULL é um NULL e uma ‘NULL’ é um texto, string, varchar, char.. o que lhe quiserem chamar.. mas nunca ‘NULL’ vai ser reconhecido como NULL.. e portanto, pelo menos aqui, a família Null pode estar descansada 😀 hehehe

      • Rui LUX says:

        e claro.. as “minhas” bases de dados (Oracle).. nunca me devolveram “NULL” em vez de NULL.. se é que me faço entender..
        só mais um detalhe.. NULL == NULL é falso.. já que um NULL é um valor indeterminado.. e por isso não se pode afirmar que dois valores indeterminados sejam iguais..
        um bem haja a todos!

        • Roque says:

          “if ( value.isEmpty() || value.equals(null) ) “–> completamente diferente de if (colValue.equals(“null”)) ,

          estou te tentar dizer que eu obtenho o conteudo “null” dentro de campos que estão a null na base de dados .. tu estar a tentar testar se algo é null

          …mas fica lá com o teu java que eu fico com meu … se isso te faz feliz …

        • Roque says:

          “if ( value.isEmpty() || value.equals(null) ) “–> completamente diferente de if (colValue.equals(“null”)) ,

          estou te tentar dizer que eu obtenho o conteudo “null” dentro de campos que estão a null na base de dados .. tu estar a tentar testar se algo é null

          …mas fica lá com o teu java que eu fico com meu … se isso te faz feliz …

          • Rui LUX says:

            epahh.. tem lá calma.. não é preciso entrar em stress.. mas diz-me lá.. porque raio é que a base de dados devolve “null” em vez de null.. e que base de dados é essa?

          • Roque says:

            fica em paz com o teu java

          • Rui LUX says:

            na verdade eu só uso Oracle.. PL/SQL e SQL.. estou-me mais ou menos a borrifar para o java.. mas tenho tb aqui umas “cenas” no trabalho em java.. e sei ler 😀
            fica em paz tb 🙂

  4. Nelson Costa Inácio says:

    Isto é um problema em sistemas que fazem a validação de um objecto vazio ou nulo de forma incorrecta. Ter name = “NULL” é diferente de name = NULL.
    Se estiver implementado como está apresentado no exemplo não há qualquer problema com o apelido “NULL”

  5. Nelson says:

    A culpa não é do apelido, é dos maus programadores que há por aí que não sabem o que estão a fazer…

  6. Sergio J says:

    Eu não conheço todas as linguagens, obviamente, principalmente as de scripting, mas não estou a ver a linguagem em que isto aconteceça ” if name = Sergio”. Haverá sempre aspas,plicas, ou outro delimitador.
    No entanto, não ponho de parte que isso possa acontecer em alguma linguagem ou em alguma particularidade de código.

  7. Pinto Costa says:

    o código da imagem vai dar erro a compilar, ‘name’ undefined

  8. João says:

    o exemplo não faz sentido. O null é um estado. Sendo que para uma string “null” nunca será igual a null. Mas o problema pode realmente acontecer. Por exemplo em PHP:

    $SQL=”select * from tabela where nome = $nome”;

    No exemplo anterior poderá mesmo dar asneira em alguns SGBD’s.

    $SQL=”select * from tabela where nome = ‘”.$nome.”‘”;

    Já assim teremos o problema resolvido.

  9. Watcher says:

    Alem de que, nas BD (ex. Microsft SQL) o campo de texto fica como “NULL” não como “Null” nome dos senhores , ou seja e um Null de texto e não um null/void

  10. Olha-me-os says:

    Penso que onde devem existir problemas é em bases de dados onde não é feito o parse correctamente entre os inputs dos users. Não necessariamente ao nivel de software.

  11. eleck says:

    Cheira-me que existe aqui muito pessoal que gosta de usar strings magicas, nesse tipo de validações validam-se objectos ou variaveis if(nome == nomeIntroduzido) ou if(nome.equals(nomeIntroduzido)), ou outra cena do género e se for preciso, até passa nestas validações, e o campo de base de dados é apenas varchar, ne sequer é not null, e quando se passa um parametro para a query se este for null mesmo no varchar da bd ela vai escrever null e não “null”, quando se faz o select para ler os dados de volta, pode vir um null e rebentar com alguma coisa na lógica, podem ser sistemas antigos que nao controlam nada disso

  12. João Pereira says:

    Claramente quem escreveu esta notícia, não percebe minimamente de programação, uma coisa é obter um resultado nulo de algo, outra coisa é escrever lá e no resultado ir buscar por algo %null%.

  13. Miguel Azevedo says:

    Ter o apelido “Null” “”” PODE “”” dar-lhe problemas!

    Acho que o titulo diz tudo.

  14. Not Null says:

    O artigo é claro “A questão é simples, o apelido deste casal é a mesma palavra que indica um valor nulo ou inexistente numa base de dados.”
    Antes de mandar postas de pescada experimentem colocar num campo de texto no MS SQL server NULL e entendem.

    • Rui LUX says:

      Eu não trabalho com MS SQL Server… mas ponho as mão no fogo (ou quase) em como se eu fizer algo assim..
      insert into tbl values (1, ‘NULL’); (é só um exemplo) .. e assumindo que a primeira coluna é number e a segundar é varchar.. o registo fica com um ‘NULL’ TEXTUAL.. ou seja a palava.. e não o valor indeterminado null…

    • Mark says:

      Mas que grande confusão que para aqui vai.

      Se tentares inserir pelo editor (Management Studio) não vai dar mas se inserires através de uma query (Insert into) funciona ás 1000 maravilhas.

      Durante a pesquisa a BD sabe perfeitamente a diferença.
      SELECT name FROM Table_1 where name is NULL //Forma para pesquisar campo vazio (NULL)

      SELECT name FROM Table_1 where name = ‘NULL’ //Forma para pesquisar um campo com o valor ‘NULL’

      Ao receberes os dados, se for NULL (vazio) recebes um objecto/string sem valor, se for “NULL” (string) recebes 1 string normal.

      • Xinuo says:

        Não entendi. O problema acontece ou não com esse Management Studio?

        • Mark says:

          No “editor gráfico” do Management Studio ao inserir NULL isso vai inserir um valor nulo/vazio na Base de Dados.
          Se for por comandos SQL (forma correcta de trabalhar) tudo funciona bem.

          Nao esquecer que o “editor gráfico” Management Studio é só uma ferramenta para se ter uma representação visual dos nosso dados e por isso um pouco limitado.
          Por ex: dependendo da forma utilizada para visualizar os dados, um booleano pode ser apresentado como “True/False” ou como “0/1”.

    • Xinuo says:

      Só sendo uma ferramenta da MICOsoft para fazer tamanha bobagem. Kkkkkkkkkkkk.

  15. Xinuo says:

    Já ia reclamar de que o apelido não seria grande problema, até consultar o dicionário e saber que em Portugal apelido = sobrenome (= nome de família).

    Mas para não perder a ocasião, não vejo como o trecho do programa apresentado causaria o problema. Alguém sabe de um trecho de programa que cause o problema apresentado no artigo?

  16. Kekes says:

    A uns tempos li está notícia na BBC e lá explica de forma mais extensa o problema desta família de forma a criticar como estão programadas as bases de dados e os forms. Eu não percebo muito de programação mas suponho que seja verdade dado a credibilidade da fonte. Também comentavam o caso de um indivíduo que o seu nome não era aceite na base de dados de um banco japonês e que tiveram que inserir manualmente os seus dados na base de dados.

    • Mark says:

      Isso acontecia mais nos sistemas mais antigos, hoje em dia somente se a pessoa que está a desenvolver não perceber nada do que está a tentar fazer.
      Isso é quase como permitir ataques por SQL injection, onde é inserindo comandos de SQL nas caixas de texto/pesquisa ou até mesmo no URL o sistema comer aquilo como sendo um comando e não como sendo um texto/nome

  17. Fernando Ribeiro says:

    Esquecem-se da família “Nothing”! Coitados! Sempre que a aplicação corre VB.NET os “Nothing” também são prejudicados!

  18. KURT says:

    Este assunto está super batido, procurem sobre Null Dilemma ou procurem pelo caso do Raven Felix Null, são apenas 2 exemplos, existem muitos mais.

    Uma nota importante é que na maioria dos casos o problema não é das bases de dados, é sim das aplicações desenvolvidas por programadores que não percebem de bases de dados. Basicamente as bases de dados recebem “NULL” e retornam “NULL” (string) e a aplicação é que assume que a string “NULL” é igual a NULL e isso provoca um erro na aplicação.

    E não é só com o “NULL”, costuma também acontecer muitas vezes com nomes que tenham mais de 36 caracteres, entre outros casos.

  19. Nunes says:

    Parece a história do outro que os pais lhe deram o nome de Roberto’); DROP TABLE Students;–

  20. 'drop table users says:

    O meu nome e ‘drop table users e nunca tive problemas xD

  21. Carlos says:

    Não dá problemas nos sites com código bem feito.

Deixe um comentário

O seu endereço de email não será publicado.

You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Aviso: Todo e qualquer texto publicado na internet através deste sistema não reflete, necessariamente, a opinião deste site ou do(s) seu(s) autor(es). Os comentários publicados através deste sistema são de exclusiva e integral responsabilidade e autoria dos leitores que dele fizerem uso. A administração deste site reserva-se, desde já, no direito de excluir comentários e textos que julgar ofensivos, difamatórios, caluniosos, preconceituosos ou de alguma forma prejudiciais a terceiros. Textos de caráter promocional ou inseridos no sistema sem a devida identificação do seu autor (nome completo e endereço válido de email) também poderão ser excluídos.