Mi capita spesso di aver bisogno di usare conversioni tra tipi di dati di ambienti diversi: ormai non ho problemi a farlo tra Sql Server e .NET, ma ogni tanto mi occorre farlo tra .NET e le API Win32 e già la cosa si complica.
Recentemente poi con l’avvento delle AI e la necessità di imparare Python (sono ancora ai primi passi, non credo di scriverne a breve) questa esigenza è aumentata.
Inizialmente pensavo di pubblicare una tabella ma già alla prima bozza dell’articolo mi sono reso conto che sarebbe stata poco leggibile. Ho deciso perciò che l’articolo avrebbe avuto una struttura più classica: un paragrafo per ogni tipo di dato .NET (ordinati in ordine alfabetico) con l’elenco dei tipi negli altri ambienti.
Boolean
Dimensione: 8 bit (1 byte)
Range: True o False
Visual Basic: Boolean
C#: bool
Java: boolean
Python: bool
Win32 API: BOOL
SQL Server: BIT
MySQL: BOOLEAN / TINYINT(1)
PostgreSQL: BOOLEAN
Oracle: NUMBER(1)
Byte
Dimensione: 8 bit
Range: 0 a 255
Visual Basic: Byte
C#: byte
Java: byte (signed: -128 a 127)
Python: int (0-255)
Win32 API: BYTE
SQL Server: TINYINT
MySQL: TINYINT UNSIGNED
PostgreSQL: SMALLINT
Oracle: NUMBER(3)
Char
Dimensione: 16 bit
Range: U+0000 a U+FFFF (carattere Unicode)
Visual Basic: Char
C#: char
Java: char
Python: str (singolo carattere)
Win32 API: WCHAR / TCHAR
SQL Server: NCHAR(1)
MySQL: CHAR(1)
PostgreSQL: CHAR(1)
Oracle: CHAR(1)
DateTime
Dimensione: 64 bit
Range: 01/01/0001 00:00:00 a 31/12/9999 23:59:59
Visual Basic: Date / DateTime
C#: DateTime
Java: java.time.LocalDateTime / java.util.Date
Python: datetime.datetime
Win32 API: SYSTEMTIME / FILETIME
SQL Server: DATETIME / DATETIME2
MySQL: DATETIME
PostgreSQL: TIMESTAMP
Oracle: DATE / TIMESTAMP
Decimal
Dimensione: 128 bit
Range: ±1.0 × 10^-28 a ±7.9228 × 10^28 (29 cifre significative)
Visual Basic: Decimal
C#: decimal
Java: java.math.BigDecimal
Python: decimal.Decimal
Win32 API: – (non supportato nativamente)
SQL Server: DECIMAL / NUMERIC
MySQL: DECIMAL / NUMERIC
PostgreSQL: DECIMAL / NUMERIC
Oracle: NUMBER
Double
Dimensione: 64 bit
Range: ±5.0 × 10^-324 a ±1.7 × 10^308
Visual Basic: Double
C#: double
Java: double
Python: float
Win32 API: double
SQL Server: FLOAT(53)
MySQL: DOUBLE
PostgreSQL: DOUBLE PRECISION
Oracle: BINARY_DOUBLE
Int16
Dimensione: 16 bit
Range: -32,768 a 32,767
Visual Basic: Short
C#: short
Java: short
Python: int
Win32 API: SHORT / WORD
SQL Server: SMALLINT
MySQL: SMALLINT
PostgreSQL: SMALLINT
Oracle: NUMBER(5)
Int32
Dimensione: 32 bit
Range: -2,147,483,648 a 2,147,483,647
Visual Basic: Integer
C#: int
Java: int
Python: int
Win32 API: INT / LONG / DWORD
SQL Server: INT
MySQL: INT
PostgreSQL: INTEGER
Oracle: NUMBER(10)
Int64
Dimensione: 64 bit
Range: -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
Visual Basic: Long
C#: long
Java: long
Python: int
Win32 API: LONGLONG / INT64
SQL Server: BIGINT
MySQL: BIGINT
PostgreSQL: BIGINT
Oracle: NUMBER(19)
Object
Dimensione: Variabile (riferimento: 32/64 bit)
Range: Qualsiasi tipo di dato
Visual Basic: Object
C#: object
Java: java.lang.Object
Python: object
Win32 API: LPVOID / PVOID
SQL Server: SQL_VARIANT
MySQL: JSON
PostgreSQL: JSON / JSONB
Oracle: BLOB / CLOB
SByte
Dimensione: 8 bit
Range: -128 a 127
Visual Basic: SByte
C#: sbyte
Java: byte
Python: int (-128 to 127)
Win32 API: CHAR
SQL Server: TINYINT
MySQL: TINYINT
PostgreSQL: SMALLINT
Oracle: NUMBER(3)
Single
Dimensione: 32 bit
Range: ±1.5 × 10^-45 a ±3.4 × 10^38
Visual Basic: Single
C#: float
Java: float
Python: float
Win32 API: float
SQL Server: REAL / FLOAT(24)
MySQL: FLOAT
PostgreSQL: REAL
Oracle: BINARY_FLOAT
String
Dimensione: Variabile
Range: 0 a circa 2 miliardi di caratteri Unicode
Visual Basic: String
C#: string
Java: java.lang.String
Python: str
Win32 API: LPSTR / LPWSTR / LPTSTR
SQL Server: NVARCHAR / VARCHAR
MySQL: VARCHAR / TEXT
PostgreSQL: VARCHAR / TEXT
Oracle: VARCHAR2 / CLOB
UInt16
Dimensione: 16 bit
Range: 0 a 65,535
Visual Basic: UShort
C#: ushort
Java: char (come unsigned)
Python: int (0-65535)
Win32 API: USHORT / WORD
SQL Server: INT
MySQL: SMALLINT UNSIGNED
PostgreSQL: INTEGER
Oracle: NUMBER(5)
UInt32
Dimensione: 32 bit
Range: 0 a 4,294,967,295
Visual Basic: UInteger
C#: uint
Java: int (uso con maschere)
Python: int
Win32 API: UINT / DWORD / ULONG
SQL Server: BIGINT
MySQL: INT UNSIGNED
PostgreSQL: BIGINT
Oracle: NUMBER(10)
UInt64
Dimensione: 64 bit
Range: 0 a 18,446,744,073,709,551,615
Visual Basic: ULong
C#: ulong
Java: long (uso con maschere)
Python: int
Win32 API: ULONGLONG / UINT64
SQL Server: DECIMAL(20,0)
MySQL: BIGINT UNSIGNED
PostgreSQL: NUMERIC(20,0)
Oracle: NUMBER(20)
Note Importanti
Differenze tra Piattaforme
- Java non supporta nativamente tipi unsigned (eccetto
char) - Python usa
intcon precisione arbitraria per tutti gli interi - Win32 API varia in base alla modalità Unicode/ANSI
- SQL Server distingue tra
VARCHAR(ASCII) eNVARCHAR(Unicode) - Oracle utilizza
NUMBERcome tipo numerico universale
Comunque visto che la tabella può tornare comoda per una conversione veloce tra tipi, la metto a disposizione qui (NB: i valori sono separati da “;”):