Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957

    [Mysql] problemi con i calcoli

    Ciao a tutti,
    ho creato una semplice tabella:

    CREATE TABLE `test` (
    `num` tinyint(1) unsigned NOT NULL default '0',
    PRIMARY KEY (`num`)
    );
    INSERT INTO `test` VALUES (1);


    e poi ho provato a fare questo:

    SELECT -2*num+1 as calcolo FROM test

    e sapete cosa mi torna?
    18446744073709551615
    al posto di -1

    Risolto tutto, togliendo "unsigned" alla struttura della tabella... ma perchè fa così?
    Se ho un unsigned e lo uso per la selezione di un calcolo, non posso ottenere un numero negativo?

    Grazie

  2. #2
    unsigned.... significa senza segno. Quindi solo numeri positivi

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    unsigned significa senza segno quindi senza il segno sono solo positivi
    http://www.anobii.com/isalreadyinuse

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    eh si, ho capito.
    Ma se uso un unsigned su una proiezione mi rimane tutto senza segno?

    SELECT num*(-1) as prova

    secondo la mia logica questa proiezione dovrebbe darmi solo numeri negativi...
    Perchè prova è UNSIGNED?

    E se facessi

    CREATE TABLE `test` (
    `num` tinyint(1) unsigned NOT NULL default '0',
    `num2` tinyint(1) NOT NULL default '0',
    PRIMARY KEY (`num`)
    );
    INSERT INTO `test` VALUES (1,-1);

    SELECT num * num2 as prova

    Dovrebbe uscire ancora un Unsigned....

  5. #5
    dovrei fare qualche verifica .... ma cosi' a occhio se il numero e' UNSIGNED moltiplicarlo per -1 significa mettere ad 1 il bit piu' significativo che e' appunto quello usato per stabilire se il numero e' positivo oppure negativo (nel SIGNED), mentre nell'UNSIGNED viene utilizzato come valore.

    e quindi ti appare il max num possibile a 8 byte che e' poi quello del BIGINT UNSIGNED... tieni presente che i valori INT numerici sono memorizzati nel db come una bit map

    salvo errori od omissioni.

    @edit... va da se che moltiplicare un numero unsigned dove il valore max e' la bit map tutta ad 1 per uno SIGNED dove il bit piu' significativo puo' essere 1/0 a seconda se il valore e' negativo o positivo non e' molto congruente..... occhio che parliamo di bit map e non di valori numerici ascii.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    si, capisco che sono bitmap, ma speravo fosse un problema di mysql... non mio...
    come se facessi:
    CONCAT('P',1) e mi concatenasse 'P' al carattere ASCI 001 e non 'P1'... no?

  7. #7
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da GoldEmish
    speravo fosse un problema di mysql...
    http://dev.mysql.com/doc/refman/5.0/...#operator_plus
    If one of the arguments is an unsigned integer, and the other argument is also an integer, the result is an unsigned integer
    Come si suol dire, "non è un bug, è una feature"

    Puoi sempre risolvere con un cast:
    SELECT -2*(cast(num as signed))+1 as calcolo FROM test

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.