# SQL Data Types

Each DBMS defines its own SQL types. Each ODBC driver exposes only those SQL data types that the associated DBMS defines. Information about how a driver maps DBMS SQL types to the ODBC-defined SQL type identifiers and how a driver maps DBMS SQL types to its own driver-specific SQL type identifiers is returned through a call to **SQLGetTypeInfo**. A driver also returns the SQL data types when describing the data types of columns and parameters through calls to **SQLColAttribute**, **SQLColumns**, **SQLDescribeCol**, **SQLDescribeParam**, **SQLProcedureColumns**, and **SQLSpecialColumns**.

##### Note

The SQL data types are contained in the SQL_DESC_ CONCISE_TYPE, SQL_DESC_TYPE, and SQL_DESC_DATETIME_INTERVAL_CODE fields of the implementation descriptors. Characteristics of the SQL data types are contained in the SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_LENGTH, and SQL_DESC_OCTET_LENGTH fields of the implementation descriptors. For more information, see Data Type Identifiers and Descriptors later in this appendix.

A given driver and data source do not necessarily support all the SQL data types that are defined in this appendix. A driver's support for SQL data types depends on the level of SQL-92 that the driver complies with. To determine the level of SQL-92 grammar supported by the driver, an application calls **SQLGetInfo** with the SQL_SQL_CONFORMANCE information type. Additionally, a given driver and data source may support additional, driver-specific SQL data types. To determine which data types a driver supports, an application calls **SQLGetTypeInfo**. For information about driver-specific SQL data types, see the driver's documentation. For information about the data types in a specific data source, see the documentation for that data source.

##### Important

The tables throughout this appendix are only guidelines and show typically used names, ranges, and limits of SQL data types. A given data source might support only some of the listed data types, and the characteristics of the supported data types can differ from those listed.

The following table lists valid SQL type identifiers for all SQL data types. The table also lists the name and description of the corresponding data type from SQL-92 (if one exists).

SQL type identifier[1] | Typical SQL data type[2] |
Typical type description |
---|---|---|

SQL_CHAR | CHAR(n) |
Character string of fixed string length n. |

SQL_VARCHAR | VARCHAR(n) |
Variable-length character string with a maximum string length n. |

SQL_LONGVARCHAR | LONG VARCHAR | Variable length character data. Maximum length is data source–dependent.[9] |

SQL_WCHAR | WCHAR(n) |
Unicode character string of fixed string length n |

SQL_WVARCHAR | VARWCHAR(n) |
Unicode variable-length character string with a maximum string length n |

SQL_WLONGVARCHAR | LONGWVARCHAR | Unicode variable-length character data. Maximum length is data source–dependent |

SQL_DECIMAL | DECIMAL(p,s) |
Signed, exact, numeric value with a precision of at least p and scale s. (The maximum precision is driver-defined.) (1 <= p <= 15; s <= p).[4] |

SQL_NUMERIC | NUMERIC(p,s) |
Signed, exact, numeric value with a precision p and scale s (1 <= p <= 15; s <= p).[4] |

SQL_SMALLINT | SMALLINT | Exact numeric value with precision 5 and scale 0 (signed: –32,768 <= n <= 32,767, unsigned: 0 <= n <= 65,535)[3]. |

_INTEGER | INTEGER | Exact numeric value with precision 10 and scale 0 (signed: –2[31] <= n <= 2[31] – 1, unsigned: 0 <= n <= 2[32] – 1)[3]. |

SQL_REAL | REAL | Signed, approximate, numeric value with a binary precision 24 (zero or absolute value 10[–38] to 10[38]). |

SQL_FLOAT | FLOAT(p) |
Signed, approximate, numeric value with a binary precision of at least p. (The maximum precision is driver-defined.)[5] |

SQL_DOUBLE | DOUBLE PRECISION | Signed, approximate, numeric value with a binary precision 53 (zero or absolute value 10[–308] to 10[308]). |

SQL_BIT | BIT | Single bit binary data.[8] |

SQL_TINYINT | TINYINT | Exact numeric value with precision 3 and scale 0 (signed: –128 <= n <= 127, unsigned: 0 <= n <= 255)[3]. |

_BIGINT | BIGINT | Exact numeric value with precision 19 (if signed) or 20 (if unsigned) and scale 0 (signed: –2[63] <= n <= 2[63] – 1, unsigned: 0 <= n <= 2[64] – 1)[3],[9]. |

SQL_BINARY | BINARY(n) |
Binary data of fixed length n.[9] |

SQL_VARBINARY | VARBINARY(n) |
Variable length binary data of maximum length n. The maximum is set by the user.[9] |

SQL_LONGVARBINARY | LONG VARBINARY | Variable length binary data. Maximum length is data source–dependent.[9] |

SQL_TYPE_DATE[6] | DATE | Year, month, and day fields, conforming to the rules of the Gregorian calendar. (See Constraints of the Gregorian Calendar, later in this appendix.) |

SQL_TYPE_TIME[6] | TIME(p) |
Hour, minute, and second fields, with valid values for hours of 00 to 23, valid values for minutes of 00 to 59, and valid values for seconds of 00 to 61. Precision p indicates the seconds precision. |

SQL_TYPE_TIMESTAMP[6] | TIMESTAMP(p) |
Year, month, day, hour, minute, and second fields, with valid values as defined for the DATE and TIME data types. |

_TYPE_UTCDATETIME | UTCDATETIME | Year, month, day, hour, minute, second, utchour, and utcminute fields. The utchour and utcminute fields have 1/10 microsecond precision. |

SQL_TYPE_UTCTIME | UTCTIME | Hour, minute, second, utchour, and utcminute fields. The utchour and utcminute fields have 1/10 microsecond precision.. |

SQL_INTERVAL_MONTH[7] | INTERVAL MONTH(p) |
Number of months between two dates; p is the interval leading precision. |

SQL_INTERVAL_YEAR[7] | INTERVAL YEAR(p) |
Number of years between two dates; p is the interval leading precision. |

SQL_INTERVAL_YEAR_TO_MONTH[7] | INTERVAL YEAR(p) TO MONTH |
Number of years and months between two dates; p is the interval leading precision. |

SQL_INTERVAL_DAY[7] | INTERVAL DAY(p) |
Number of days between two dates; p is the interval leading precision. |

SQL_INTERVAL_HOUR[7] | INTERVAL HOUR(p) |
Number of hours between two date/times; p is the interval leading precision. |

SQL_INTERVAL_MINUTE[7] | INTERVAL MINUTE(p) |
Number of minutes between two date/times; p is the interval leading precision. |

SQL_INTERVAL_SECOND[7] | INTERVAL SECOND(p,q) |
Number of seconds between two date/times; p is the interval leading precision and q is the interval seconds precision. |

_INTERVAL_DAY_TO_HOUR[7] | INTERVAL DAY(p) TO HOUR |
Number of days/hours between two date/times; p is the interval leading precision. |

SQL_INTERVAL_DAY_TO_MINUTE[7] | INTERVAL DAY(p) TO MINUTE |
Number of days/hours/minutes between two date/times; p is the interval leading precision. |

SQL_INTERVAL_DAY_TO_SECOND[7] | INTERVAL DAY(p) TO SECOND(q) |
Number of days/hours/minutes/seconds between two date/times; p is the interval leading precision and q is the interval seconds precision. |

SQL_INTERVAL_HOUR_TO_MINUTE[7] | INTERVAL HOUR(p) TO MINUTE |
Number of hours/minutes between two date/times; p is the interval leading precision. |

SQL_INTERVAL_HOUR_TO_SECOND[7] | INTERVAL HOUR(p) TO SECOND(q) |
Number of hours/minutes/seconds between two date/times; p is the interval leading precision and q is the interval seconds precision. |

_INTERVAL_MINUTE_TO_SECOND[7] | INTERVAL MINUTE(p) TO SECOND(q) |
Number of minutes/seconds between two date/times; p is the interval leading precision and q is the interval seconds precision. |

SQL_GUID | GUID | Fixed length GUID. |

[1] This is the value returned in the DATA_TYPE column by a call to **SQLGetTypeInfo**.

[2] This is the value returned in the NAME and CREATE PARAMS column by a call to **SQLGetTypeInfo**. The NAME column returns the designation—for example, CHAR—whereas the CREATE PARAMS column returns a comma-separated list of creation parameters such as precision, scale, and length.

[3] An application uses **SQLGetTypeInfo** or **SQLColAttribute** to determine whether a particular data type or a particular column in a result set is unsigned.

[4] SQL_DECIMAL and SQL_NUMERIC data types differ only in their precision. The precision of a DECIMAL(*p*,*s*) is an implementation-defined decimal precision that is no less than *p*, whereas the precision of a NUMERIC(*p*,*s*) is exactly equal to *p*.

[5] Depending on the implementation, the precision of SQL_FLOAT can be either 24 or 53: if it is 24, the SQL_FLOAT data type is the same as SQL_REAL; if it is 53, the SQL_FLOAT data type is the same as SQL_DOUBLE.

[6] In ODBC 3*.x*, the SQL date, time, and timestamp data types are SQL_TYPE_DATE, SQL_TYPE_TIME, and SQL_TYPE_TIMESTAMP, respectively; in ODBC 2.*x*, the data types are SQL_DATE, SQL_TIME, and SQL_TIMESTAMP.

[7] For more information about the interval SQL data types, see the Interval Data Types section, later in this appendix.

[8] The SQL_BIT data type has different characteristics than the BIT type in SQL-92.

[9] This data type has no corresponding data type in SQL-92.

This section provides the following example.