Memahami konversi jenis data

Unduh driver JDBC

Untuk memfasilitasi konversi jenis data bahasa pemrograman Java ke jenis data SQL Server, Driver Microsoft JDBC untuk SQL Server menyediakan konversi jenis data sebagaimana diperlukan oleh spesifikasi JDBC. Untuk fleksibilitas tambahan, semua jenis dapat dikonversi ke dan dari jenis data Object, String, dan byte[] .

Catatan

Saat menggunakan Always Encrypted, pertimbangan khusus perlu dilakukan sekeliling konversi jenis data. Untuk informasi selengkapnya, lihat Kesalahan konversi jenis data yang tidak didukung.

Konversi metode getter

Berdasarkan jenis data SQL Server, bagan berikut berisi peta konversi driver JDBC untuk metode get<Type>() kelas SQLServerResultSet , dan konversi yang didukung untuk metode get<Type> dari kelas SQLServerCallableStatement .

JDBC to SQL Server type conversion matrix

Ada tiga kategori konversi yang didukung oleh metode getter driver JDBC:

  • Non-Lossy (x): Konversi untuk kasus di mana jenis getter sama atau lebih kecil dari jenis server yang mendasar. Misalnya, saat memanggil getBigDecimal pada kolom desimal server yang mendasar, tidak ada konversi yang diperlukan.

  • Dikonversi (y): Konversi dari jenis server numerik ke jenis bahasa Java di mana konversi reguler dan mengikuti aturan konversi bahasa Java. Untuk konversi ini, presisi selalu dipotong-tidak pernah dibulatkan dan luapan ditangani sebagai modulo dari jenis tujuan, yang lebih kecil. Misalnya, memanggil getInt pada kolom desimal yang mendasar yang berisi "1,9999" akan mengembalikan "1", atau jika nilai desimal yang mendasar adalah "3000000000" maka nilai int meluap ke "-1294967296".

  • Dependen Data (z): Konversi dari jenis karakter yang mendasar ke jenis numerik mengharuskan jenis karakter berisi nilai yang dapat dikonversi menjadi jenis tersebut. Tidak ada konversi lain yang dilakukan. Jika nilai terlalu besar untuk jenis getter, nilainya tidak valid. Misalnya, jika getInt dipanggil pada kolom varchar(50) yang berisi "53", nilai dikembalikan sebagai int; tetapi jika nilai yang mendasar adalah "xyz" atau "3000000000", kesalahan akan muncul.

Jika getString dipanggil pada jenis data kolom biner, varbinary, varbinary(max), atau image , nilai dikembalikan sebagai nilai string heksadesimal.

Konversi metode Updater

Untuk data jenis Java yang diteruskan ke metode update<Type>() kelas SQLServerResultSet , konversi berikut berlaku.

JDBCUpdaterConversions

Ada tiga kategori konversi yang didukung oleh metode pembaruan driver JDBC:

  • Non-Lossy (x): Konversi untuk kasus di mana jenis updater sama atau lebih kecil dari jenis server yang mendasar. Misalnya, saat memanggil updateBigDecimal pada kolom desimal server yang mendasar, tidak ada konversi yang diperlukan.

  • Dikonversi (y): Konversi dari jenis server numerik ke jenis bahasa Java di mana konversi reguler dan mengikuti aturan konversi bahasa Java. Untuk konversi ini, presisi selalu dipotong (tidak pernah dibulatkan) dan luapan ditangani sebagai modul dari jenis tujuan (yang lebih kecil). Misalnya, memanggil updateDecimal pada kolom int yang mendasar yang berisi "1,9999" akan mengembalikan "1", atau jika nilai desimal yang mendasar adalah "3000000000" maka nilai int meluap ke "-1294967296".

  • Dependen Data (z): Konversi dari jenis data sumber yang mendasar ke jenis data tujuan mengharuskan nilai yang terkandung dapat dikonversi menjadi jenis tujuan. Tidak ada konversi lain yang dilakukan. Jika nilai terlalu besar untuk jenis getter, nilainya tidak valid. Misalnya, jika updateString dipanggil pada kolom int yang berisi "53", pembaruan berhasil; tetapi jika nilai String yang mendasar adalah "foo" atau "3000000000", kesalahan akan muncul.

Saat updateString dipanggil pada jenis data kolom biner, varbinary, varbinary(max), atau image , ia menangani nilai String sebagai nilai string heksadesimal.

Ketika jenis data kolom SQL Server adalah XML, nilai data harus berupa XML yang valid. Saat memanggil metode updateBytes, updateBinaryStream, atau updateBlob, nilai data harus menjadi representasi string heksadesimal dari karakter XML. Misalnya:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

Perhatikan bahwa tanda urutan byte (BOM) diperlukan jika karakter XML berada dalam pengodean karakter tertentu.

Konversi metode setter

Untuk data jenis Java yang diteruskan ke metode set<Type>() dari kelas SQLServerPreparedStatement dan kelas SQLServerCallableStatement , konversi berikut berlaku.

JDBCSetterConversions

Server mencoba konversi apa pun dan mengembalikan kesalahan pada kegagalan.

Dalam kasus jenis data String , jika nilai melebihi panjang VARCHAR, nilai tersebut akan dipetakan ke LONGVARCHAR. Demikian pula, NVARCHAR memetakan ke LONGNVARCHAR jika nilainya melebihi panjang NVARCHAR yang didukung. Hal yang sama berlaku untuk byte[]. Nilai yang lebih panjang dari VARBINARY menjadi LONGVARBINARY.

Ada dua kategori konversi yang didukung oleh metode setter driver JDBC:

  • Non-Lossy (x): Konversi untuk kasus numerik di mana jenis setter sama atau lebih kecil dari jenis server yang mendasar. Misalnya, saat memanggil setBigDecimal pada kolom desimal server yang mendasar, tidak ada konversi yang diperlukan. Untuk kasus numerik ke karakter, jenis data numerik Java dikonversi ke String. Misalnya, memanggil setDouble dengan nilai "53" pada kolom varchar(50) menghasilkan nilai karakter "53" di kolom tujuan tersebut.

  • Dikonversi (y): Konversi dari jenis numerik Java ke jenis numerik server yang mendasar yang lebih kecil. Konversi ini bersifat reguler dan mengikuti konvensi konversi SQL Server. Presisi selalu dipotong (tidak pernah dibulatkan) dan luapan memunculkan kesalahan konversi yang tidak didukung. Misalnya, menggunakan updateDecimal dengan nilai "1,9999" pada kolom bilangan bulat yang mendasar menghasilkan "1" di kolom tujuan; tetapi jika "3000000000" diteruskan, driver melemparkan kesalahan.

  • Dependen Data (z): Konversi dari jenis String Java ke jenis data SQL Server yang mendasar tergantung pada kondisi berikut: Driver mengirim nilai String ke SQL Server dan SQL Server melakukan konversi, jika perlu. Jika sendStringParametersAsUnicode diatur ke true dan jenis data SQL Server yang mendasar adalah gambar, SQL Server tidak mengizinkan konversi nvarchar ke gambar dan melempar SQLServerException. Jika sendStringParametersAsUnicode diatur ke false dan jenis data SQL Server yang mendasar adalah gambar, SQL Server memungkinkan konversi varchar ke gambar dan tidak melemparkan pengecualian.

SQL Server melakukan konversi dan meneruskan kesalahan kembali ke driver JDBC ketika ada masalah.

Ketika jenis data kolom SQL Server adalah XML, nilai data harus berupa XML yang valid. Saat memanggil metode updateBytes, updateBinaryStream, atau updateBlob, nilai data harus menjadi representasi string heksadesimal dari karakter XML. Misalnya:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

Perhatikan bahwa tanda urutan byte (BOM) diperlukan jika karakter XML berada dalam pengodean karakter tertentu.

Konversi pada setObject

Catatan

Microsoft JDBC Drivers 4.2 (dan yang lebih tinggi) untuk SQL Server mendukung JDBC 4.1 dan 4.2. Untuk detail selengkapnya tentang pemetaan dan konversi jenis data 4.1 dan 4.2, lihat kepatuhan JDBC 4.1 untuk kepatuhan Driver JDBC dan JDBC 4.2 untuk Driver JDBC, selain informasi di bawah ini.

Untuk data jenis Java yang diteruskan ke metode setObject(<Type) dari kelas SQLServerPreparedStatement,> konversi berikut berlaku.

JDBCSetObjectConversions

Metode setObject tanpa jenis target yang ditentukan menggunakan pemetaan default. Dalam kasus jenis data String , jika nilai melebihi panjang VARCHAR, nilai tersebut akan dipetakan ke LONGVARCHAR. Demikian pula, NVARCHAR memetakan ke LONGNVARCHAR jika nilainya melebihi panjang NVARCHAR yang didukung. Hal yang sama berlaku untuk byte[]. Nilai yang lebih panjang dari VARBINARY menjadi LONGVARBINARY.

Ada tiga kategori konversi yang didukung oleh metode setObject driver JDBC:

  • Non-Lossy (x): Konversi untuk kasus numerik di mana jenis setter sama atau lebih kecil dari jenis server yang mendasar. Misalnya, saat memanggil setBigDecimal pada kolom desimal server yang mendasar, tidak ada konversi yang diperlukan. Untuk kasus numerik ke karakter, jenis data numerik Java dikonversi ke String. Misalnya, memanggil setDouble dengan nilai "53" pada kolom varchar(50) akan menghasilkan nilai karakter "53" di kolom tujuan tersebut.

  • Dikonversi (y): Konversi dari jenis numerik Java ke jenis numerik server yang mendasar yang lebih kecil. Konversi ini bersifat reguler dan mengikuti konvensi konversi SQL Server. Presisi selalu dipotong-tidak pernah dibulatkan dan luapan memunculkan kesalahan konversi yang tidak didukung. Misalnya, menggunakan updateDecimal dengan nilai "1,9999" pada kolom bilangan bulat yang mendasar menghasilkan "1" di kolom tujuan; tetapi jika "3000000000" diteruskan, driver melemparkan kesalahan.

  • Dependen Data (z): Konversi dari jenis String Java ke jenis data SQL Server yang mendasar tergantung pada kondisi berikut: Driver mengirim nilai String ke SQL Server dan SQL Server melakukan konversi, jika perlu. Jika properti koneksi sendStringParametersAsUnicode diatur ke true dan jenis data SQL Server yang mendasar adalah gambar, SQL Server tidak mengizinkan konversi nvarchar ke gambar dan melempar SQLServerException. Jika sendStringParametersAsUnicode diatur ke false dan jenis data SQL Server yang mendasar adalah gambar, SQL Server memungkinkan konversi varchar ke gambar dan tidak melemparkan pengecualian.

SQL Server melakukan sebagian besar konversi yang ditetapkan dan meneruskan kesalahan kembali ke driver JDBC ketika ada masalah. Konversi sisi klien adalah pengecualian dan hanya dilakukan dalam kasus tanggal, waktu, tanda waktu, Boolean, dan nilai String.

Ketika jenis data kolom SQL Server adalah XML, nilai data harus berupa XML yang valid. Saat memanggil metode setObject(byte[], SQLXML), setObject(inputStream, SQLXML), atau setObject(Blob, SQLXML), nilai data harus menjadi representasi string heksadesimal dari karakter XML. Misalnya:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

Perhatikan bahwa tanda urutan byte (BOM) diperlukan jika karakter XML berada dalam pengodean karakter tertentu.

Lihat juga

Memahami jenis data driver JDBC