Skip to main content

SQL Server Type Support

Foundations JDBC provides comprehensive support for SQL Server data types, including geography, geometry, hierarchyid, and Unicode types.

Key Differences

  • TINYINT is UNSIGNED in SQL Server (0-255), unlike most other databases
  • Separate Unicode types (NCHAR, NVARCHAR, NTEXT) vs non-Unicode
  • DATETIMEOFFSET for timezone-aware timestamps
  • UNIQUEIDENTIFIER for UUIDs/GUIDs
  • No native array support - use table-valued parameters instead

Integer Types

SQL Server TypeJava TypeRangeNotes
TINYINTShort0-255Unsigned!
SMALLINTShort-32,768 to 32,767
INTInteger-2^31 to 2^31-1
BIGINTLong-2^63 to 2^63-1
SqlServerType<Short> tinyType = SqlServerTypes.tinyint;   // Note: unsigned!
SqlServerType<Integer> intType = SqlServerTypes.int_;
SqlServerType<Long> bigType = SqlServerTypes.bigint;

Fixed-Point Types

SQL Server TypeJava TypeNotes
DECIMAL(p,s)BigDecimalExact numeric
NUMERIC(p,s)BigDecimalAlias for DECIMAL
MONEYBigDecimalCurrency (4 decimal places)
SMALLMONEYBigDecimalSmaller currency range
SqlServerType<BigDecimal> decimalType = SqlServerTypes.decimal;
SqlServerType<BigDecimal> precise = SqlServerTypes.decimal(18, 4);
SqlServerType<BigDecimal> moneyType = SqlServerTypes.money;

Floating-Point Types

SQL Server TypeJava TypeNotes
REALFloat32-bit IEEE 754
FLOATDouble64-bit IEEE 754
SqlServerType<Float> realType = SqlServerTypes.real;
SqlServerType<Double> floatType = SqlServerTypes.float_;

Boolean Type

SQL Server TypeJava Type
BITBoolean
SqlServerType<Boolean> bitType = SqlServerTypes.bit;

String Types (Non-Unicode)

SQL Server TypeJava TypeMax LengthNotes
CHAR(n)String8,000 charsFixed-length
VARCHAR(n)String8,000 charsVariable-length
VARCHAR(MAX)String2 GBLarge variable-length
TEXTString2 GBDeprecated, use VARCHAR(MAX)
SqlServerType<String> charType = SqlServerTypes.char_(10);
SqlServerType<String> varcharType = SqlServerTypes.varchar(255);
SqlServerType<String> varcharMax = SqlServerTypes.varcharMax;

String Types (Unicode)

SQL Server TypeJava TypeMax LengthNotes
NCHAR(n)String4,000 charsFixed-length Unicode
NVARCHAR(n)String4,000 charsVariable-length Unicode
NVARCHAR(MAX)String2 GBLarge Unicode
NTEXTString2 GBDeprecated
SqlServerType<String> ncharType = SqlServerTypes.nchar(10);
SqlServerType<String> nvarcharType = SqlServerTypes.nvarchar(255);
SqlServerType<String> nvarcharMax = SqlServerTypes.nvarcharMax;

Binary Types

SQL Server TypeJava TypeMax Length
BINARY(n)byte[]8,000 bytes
VARBINARY(n)byte[]8,000 bytes
VARBINARY(MAX)byte[]2 GB
IMAGEbyte[]2 GB (deprecated)
SqlServerType<byte[]> binaryType = SqlServerTypes.binary(16);
SqlServerType<byte[]> varbinaryType = SqlServerTypes.varbinary(255);
SqlServerType<byte[]> varbinaryMax = SqlServerTypes.varbinaryMax;

Date/Time Types

SQL Server TypeJava TypePrecisionNotes
DATELocalDateDayDate only
TIMELocalTime100nsTime only
DATETIMELocalDateTime3.33msLegacy
SMALLDATETIMELocalDateTimeMinuteLegacy
DATETIME2LocalDateTime100nsModern
DATETIMEOFFSETOffsetDateTime100nsWith timezone
SqlServerType<LocalDate> dateType = SqlServerTypes.date;
SqlServerType<LocalTime> timeType = SqlServerTypes.time;
SqlServerType<LocalTime> time3 = SqlServerTypes.time(3); // TIME(3)

// Legacy types
SqlServerType<LocalDateTime> datetimeType = SqlServerTypes.datetime;
SqlServerType<LocalDateTime> smalldtType = SqlServerTypes.smalldatetime;

// Modern types (recommended)
SqlServerType<LocalDateTime> datetime2Type = SqlServerTypes.datetime2;
SqlServerType<LocalDateTime> datetime2_3 = SqlServerTypes.datetime2(3);

// Timezone-aware
SqlServerType<OffsetDateTime> dtoType = SqlServerTypes.datetimeoffset;
SqlServerType<OffsetDateTime> dto3 = SqlServerTypes.datetimeoffset(3);

UNIQUEIDENTIFIER (UUID/GUID)

SQL Server TypeJava Type
UNIQUEIDENTIFIERjava.util.UUID
SqlServerType<UUID> uuidType = SqlServerTypes.uniqueidentifier;

XML Type

SQL Server TypeJava Type
XMLString
SqlServerType<String> xmlType = SqlServerTypes.xml;

JSON Type

SQL Server 2016+ stores JSON as NVARCHAR(MAX):

SQL Server TypeJava TypeNotes
NVARCHAR(MAX)StringJSON stored as Unicode string
SqlServerType<String> jsonType = SqlServerTypes.json;

Spatial Types

SQL Server spatial types use the JDBC driver's native classes:

SQL Server TypeJava TypeNotes
GEOGRAPHYGeographyGeodetic (round earth)
GEOMETRYGeometryPlanar (flat earth)
import com.microsoft.sqlserver.jdbc.Geography;
import com.microsoft.sqlserver.jdbc.Geometry;

SqlServerType<Geography> geoType = SqlServerTypes.geography;
SqlServerType<Geometry> geomType = SqlServerTypes.geometry;

// Create spatial objects using WKT
Geography point = Geography.STPointFromText("POINT(-122.34900 47.65100)", 4326);

HIERARCHYID

For hierarchical tree structures:

SQL Server TypeJava TypeNotes
HIERARCHYIDStringPath notation like /1/2/3/
SqlServerType<String> hierarchyType = SqlServerTypes.hierarchyid;

ROWVERSION / TIMESTAMP

SQL Server TypeJava TypeNotes
ROWVERSIONbyte[]8-byte version number
TIMESTAMPbyte[]Alias for ROWVERSION
SqlServerType<byte[]> rowversionType = SqlServerTypes.rowversion;

SQL_VARIANT

SQL Server TypeJava TypeNotes
SQL_VARIANTObjectCan store various types
SqlServerType<Object> variantType = SqlServerTypes.sqlVariant;

VECTOR (SQL Server 2025)

SQL Server TypeJava TypeNotes
VECTORbyte[]For embeddings/ML
SqlServerType<byte[]> vectorType = SqlServerTypes.vector;

Nullable Types

Any type can be made nullable using .nullable():

SqlServerType<Integer> notNull = SqlServerTypes.int_;
SqlServerType<Integer> nullable = SqlServerTypes.int_.nullable();

Custom Domain Types

Wrap base types with custom Java types using bimap:

// Wrapper type
public record OrderId(Integer value) {}

// Create SqlServerType from INT
SqlServerType<OrderId> orderIdType =
SqlServerTypes.int_.bimap(OrderId::new, OrderId::value);