Informazioni sulle conversioni dei tipi di dati
Per semplificare la conversione dei tipi di dati del linguaggio di programmazione Java nei tipi di dati di SQL Server, Microsoft JDBC Driver per SQL Server fornisce le conversioni dei tipi di dati richieste dalla specifica JDBC. Per una maggiore flessibilità, tutti i tipi sono convertibili da e verso i tipi di dati Object, String e byte[].
Nota
Quando si usa Always Encrypted, è necessario tenere presenti considerazioni speciali sulle conversioni dei tipi di dati. Per altre informazioni, vedere Errori di conversione dei tipi di dati non supportati.
Conversioni dei metodi di richiamo
In base ai tipi di dati di SQL Server, il grafico seguente contiene la mappa di conversione del driver JDBC per i metodi get<Type>() della classe SQLServerResultSet e le conversioni supportate per i metodi get<Type> della classe SQLServerCallableStatement.
Sono disponibili tre categorie di conversione supportate dai metodi getter del driver JDBC:
Senza perdita di dati (x): conversioni nei casi in cui il tipo di richiamo è inferiore o identico al tipo di server sottostante. Ad esempio, quando si esegue la chiamata a getBigDecimal in una colonna decimale del server sottostante, la conversione non è necessaria.
Convertito (y): conversioni dai tipi di server numerici nei tipi di linguaggio Java in cui la conversione è regolare e segue le regole di conversione del linguaggio Java. In tali conversioni, la precisione viene sempre troncata, mai arrotondata, e l'overflow viene gestito come modulo del tipo di destinazione inferiore. Quando, ad esempio, si chiama getInt su una colonna decimal sottostante che contiene "1,9999" il valore restituito è "1". Se invece il valore decimal sottostante è "3000000000", il valore int causa un overflow in "-1294967296".
Dipendente dai dati (z): le conversioni dai tipi di caratteri sottostanti in tipi numerici richiedono che i tipi di caratteri contengano valori che è possibile convertire in quel determinato tipo. Non vengono eseguite altre conversioni. Se è troppo grande per il tipo di richiamo, il valore non è valido. Se, ad esempio, viene chiamato getInt per una colonna varchar(50) che contiene "53", il valore viene restituito come int. Se invece il valore sottostante è "xyz" o "3000000000", viene generato un errore.
Se getString viene chiamato su un tipo di dati colonna binary, varbinary, varbinary (max) o image, il valore viene restituito come valore stringa esadecimale.
Conversioni dei metodi di aggiornamento
Per i dati tipizzati Java passati ai metodi update<Type>() della classe SQLServerResultSet, si applicano le conversioni seguenti.
Sono disponibili tre categorie di conversione supportate dai metodi di aggiornamento del driver JDBC:
Senza perdita di dati (x): conversioni nei casi in cui il tipo di aggiornamento è inferiore o identico al tipo di server sottostante. Ad esempio, quando si esegue la chiamata a updateBigDecimal in una colonna decimale del server sottostante, la conversione non è necessaria.
Convertito (y): conversioni dai tipi di server numerici nei tipi di linguaggio Java in cui la conversione è regolare e segue le regole di conversione del linguaggio Java. In tali conversioni, la precisione viene sempre troncata, mai arrotondata, e l'overflow viene gestito come modulo del tipo di destinazione, ovvero quello inferiore. Quando, ad esempio, si chiama updateDecimal su una colonna int sottostante che contiene "1,9999" il valore restituito è "1". Se invece il valore decimal sottostante è "3000000000", il valore int causa un overflow in "-1294967296".
Dipendente dai dati (z): le conversioni dai tipi di dati di origine sottostanti in tipi di dati di destinazione richiedono che i valori contenuti possano essere convertiti nei tipi di destinazione. Non vengono eseguite altre conversioni. Se è troppo grande per il tipo di richiamo, il valore non è valido. Se, ad esempio, updateString viene chiamato su una colonna int che contiene "53", l'aggiornamento verrà eseguito. Se invece il valore String sottostante è "foo" o "3000000000", verrà generato un errore.
Se updateString viene chiamato su un tipo di dati colonna binary, varbinary, varbinary (max) o image, il valore String viene gestito come valore stringa esadecimale.
Quando il tipo di dati colonna di SQL Server è XML, i dati devono avere un valore XML valido. Quando si chiama il metodo updateBytes, updateBinaryStream o updateBlob, il valore dei dati deve essere la rappresentazione della stringa esadecimale dei caratteri XML. Ad esempio:
<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E
Si noti che se i caratteri XML sono espressi in codifiche di caratteri specifiche, è necessario un indicatore dell'ordine dei byte (BOM, Byte-Order Mark).
Conversioni dei metodi di impostazione
Per i dati tipizzati Java passati ai metodi set<Type>() della classe SQLServerPreparedStatement e della classeSQLServerCallableStatement, si applicano le conversioni seguenti.
Il server cercherà di eseguire la conversione e restituirà degli errori in caso di esito negativo.
Nel caso del tipo di dati String, se il valore supera la lunghezza di VARCHAR, viene mappato a LONGVARCHAR. Analogamente, NVARCHAR viene mappato a LONGNVARCHAR se il valore supera la lunghezza supportata di NVARCHAR. Lo stesso vale per byte[]. I valori più lunghi di VARBINARY diventano LONGVARBINARY.
Sono disponibili due categorie di conversione supportate dai metodi setter del driver JDBC:
Senza perdita di dati (x): conversioni per i casi numerici in cui il tipo di impostazione è inferiore o identico al tipo di server sottostante. Ad esempio, quando si esegue la chiamata a setBigDecimal in una colonna decimale del server sottostante, la conversione non è necessaria. Per la conversione da un tipo numeric a un tipo character, il tipo di dati numeric Java viene convertito in una stringa. Ad esempio, la chiamata a setDouble con un valore pari a "53" in una colonna varchar(50) produrrà un valore character "53" nella colonna di destinazione.
Convertito (y): conversioni da un tipo Java numerico in un tipo numerico del server sottostante inferiore. Questa conversione è standard e segue le convenzioni di conversione di SQL Server. La precisione è sempre troncata, mai arrotondata, e l'overflow genera un errore di conversione non supportata. Ad esempio, se si usa updateDecimal con un valore pari a "1,9999" in una colonna Integer sottostante verrà restituito "1" nella colonna di destinazione. Se invece viene passato "3000000000", verrà generato un errore.
Dipendente dai dati (z): le conversioni da un tipo String Java al tipo di dati di SQL Server sottostante dipendono dalle condizioni seguenti: il driver invia il valore String a SQL Server e SQL Server esegue le conversioni, se necessario. Se la proprietà sendStringParametersAsUnicode è impostata su true e il tipo di dati di SQL Server sottostante è image, SQL Server non consente la conversione di nvarchar in image e genera un'eccezione SQLServerException. Se la proprietà sendStringParametersAsUnicode è impostata su false e il tipo di dati di SQL Server sottostante è image, SQL Server consente la conversione di varchar in image e non genera un'eccezione.
SQL Server esegue le conversioni e restituisce gli errori al driver JDBC in caso di problemi.
Quando il tipo di dati colonna di SQL Server è XML, i dati devono avere un valore XML valido. Quando si chiama il metodo updateBytes, updateBinaryStream o updateBlob, il valore dei dati deve essere la rappresentazione della stringa esadecimale dei caratteri XML. Ad esempio:
<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E
Si noti che se i caratteri XML sono espressi in codifiche di caratteri specifiche, è necessario un indicatore dell'ordine dei byte (BOM, Byte-Order Mark).
Conversioni in setObject
Nota
Microsoft JDBC Driver 4.2 e versioni successive per SQL Server supporta JDBC 4.1 e 4.2. Per altri dettagli sui mapping e sulle conversioni dei tipi di dati in 4.1 e 4.2, vedere Conformità con JDBC 4.1 per JDBC Driver e Conformità con JDBC 4.2 per JDBC Driver, oltre alle informazioni riportate di seguito.
Per i dati tipizzati Java passati ai metodi setObject(<Type>) della classe SQLServerPreparedStatement, si applicano le conversioni seguenti.
Il metodo setObject senza alcun tipo di destinazione specificato utilizzerà il mapping predefinito. Nel caso del tipo di dati String, se il valore supera la lunghezza di VARCHAR, viene mappato a LONGVARCHAR. Analogamente, NVARCHAR viene mappato a LONGNVARCHAR se il valore supera la lunghezza supportata di NVARCHAR. Lo stesso vale per byte[]. I valori più lunghi di VARBINARY diventano LONGVARBINARY.
Sono disponibili tre categorie di conversione supportate dai metodi setObject del driver JDBC:
Senza perdita di dati (x): conversioni per i casi numerici in cui il tipo di impostazione è inferiore o identico al tipo di server sottostante. Ad esempio, quando si esegue la chiamata a setBigDecimal in una colonna decimale del server sottostante, la conversione non è necessaria. Per la conversione da un tipo numeric a un tipo character, il tipo di dati numeric Java viene convertito in una stringa. Ad esempio, la chiamata a setDouble con un valore di "53" in una colonna varchar(50) produrrà un valore character "53" nella colonna di destinazione.
Convertito (y): conversioni da un tipo Java numerico in un tipo numerico del server sottostante inferiore. Questa conversione è standard e segue le convenzioni di conversione di SQL Server. La precisione è sempre troncata, mai arrotondata, e l'overflow genera un errore di conversione non supportata. Ad esempio, se si usa updateDecimal con un valore pari a "1,9999" in una colonna Integer sottostante verrà restituito "1" nella colonna di destinazione. Se invece viene passato "3000000000", verrà generato un errore.
Dipendente dai dati (z): le conversioni da un tipo String Java al tipo di dati di SQL Server sottostante dipendono dalle condizioni seguenti: il driver invia il valore String a SQL Server e SQL Server esegue le conversioni, se necessario. Se la proprietà d connessione sendStringParametersAsUnicode è impostata su true e il tipo di dati di SQL Server sottostante è image, SQL Server non consente la conversione di nvarchar in image e genera un'eccezione SQLServerException. Se la proprietà sendStringParametersAsUnicode è impostata su false e il tipo di dati di SQL Server sottostante è image, SQL Server consente la conversione di varchar in image e non genera un'eccezione.
SQL Server esegue le conversioni impostate in blocco e restituisce gli errori al driver JDBC in caso di problemi. Le conversioni sul lato client non sono frequenti e vengono eseguite solo nel caso di valori date, time, timestamp, Boolean e String.
Quando il tipo di dati colonna di SQL Server è XML, i dati devono avere un valore XML valido. Quando si chiama il metodo setObject(byte[], SQLXML), setObject(inputStream, SQLXML) o setObject(Blob, SQLXML), il valore dei dati deve essere la rappresentazione di stringa esadecimale dei caratteri XML. Ad esempio:
<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E
Si noti che se i caratteri XML sono espressi in codifiche di caratteri specifiche, è necessario un indicatore dell'ordine dei byte (BOM, Byte-Order Mark).