Data Types - mkleehammer/pyodbc GitHub Wiki
Python 3
Python parameters sent to the database
The following table describes how Python objects passed to Cursor.execute() as parameters are formatted and passed to the driver/database.
Description | Python Datatype | ODBC Datatype |
---|---|---|
null | None | varies (1) |
boolean | bool | BIT |
integer | int | SQL_BIGINT |
floating point | float | SQL_DOUBLE |
decimal | decimal.Decimal | SQL_NUMERIC |
string | str | SQL_VARCHAR or SQL_LONGVARCHAR (2)(3) |
binary | bytes, bytearray | SQL_VARBINARY or SQL_LONGVARBINARY (3) |
date | datetime.date | SQL_TYPE_DATE |
time | datetime.time | SQL_TYPE_TIME |
timestamp | datetime.datetime | SQL_TYPE_TIMESTAMP |
UUID / GUID | uuid.UUID | SQL_GUID |
- If the driver supports it, SQLDescribeParam is used to determine the appropriate type. If it is not supported, SQL_VARCHAR is used.
- The encoding and ODBC data type can be changed using Connection.setencoding(). See the Unicode page for more information.
- SQLGetTypeInfo is used to determine when the LONG types are used. If it is not supported, 1MB is used.
SQL values received from the database
The following table describes how database results are converted to Python objects.
Description | ODBC Datatype | Python Datatype |
---|---|---|
NULL | any | None |
bit | SQL_BIT | bool |
integers | SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT | int |
floating point | SQL_REAL, SQL_FLOAT, SQL_DOUBLE | float |
decimal, numeric | SQL_DECIMAL, SQL_NUMERIC | decimal.Decimal |
1-byte text | SQL_CHAR | str via UTF-8 (1) |
2-byte text | SQL_WCHAR | str via UTF-16LE (1) |
binary | SQL_BINARY, SQL_VARBINARY | bytes |
date | SQL_TYPE_DATE | datetime.date |
time | SQL_TYPE_TIME | datetime.time |
SQL Server time | SQL_SS_TIME2 | datetime.time |
timestamp | SQL_TIMESTAMP | datetime.datetime |
UUID / GUID | SQL_GUID | str or uuid.UUID (2) |
XML | SQL_XML | str via UTF-16LE (1) |
- The encoding can be changed using Connection.setdecoding(). See the Unicode page for more information.
- The default is
str
. Setting pyodbc.native_uuid to True will cause them to be returned as uuid.UUID objects.
Python 2
Python parameters sent to the database
Description | Python Datatype | ODBC Datatype |
---|---|---|
null | None | varies (1) |
boolean | bool | BIT |
4-byte integer | int | SQL_INTEGER |
long integer | long | SQL_BIGINT |
floating point | float | SQL_DOUBLE |
decimal | decimal.Decimal | SQL_NUMERIC |
UTF-8 (2) | str | SQL_CHAR (2) |
UTF-16LE (2) | unicode | SQL_WCHAR (2) |
binary | bytearray | SQL_VARBINARY or SQL_LONGVARBINARY (3) |
binary | buffer | SQL_VARBINARY or SQL_LONGVARBINARY (3) |
date | datetime.date | SQL_TYPE_DATE |
time | datetime.time | SQL_TYPE_TIME |
timestamp | datetime.datetime | SQL_TIMESTAMP |
UUID / GUID | uuid.UUID | SQL_GUID |
- If the driver supports it, SQLDescribeParam is used to determine the appropriate type. If it is not supported, SQL_VARCHAR is used.
- The encoding and ODBC data type can be changed using Connection.setencoding(). See the Unicode page for more information.
- SQLGetTypeInfo is used to determine when the LONG types are used. If it is not supported, 1MB is used.
SQL values received from the database
The following table describes how database results are converted to Python objects.
Description | ODBC Datatype | Python Datatype |
---|---|---|
NULL | any | None |
bit | SQL_BIT | bool |
integers | SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_BIGINT | long |
floating point | SQL_REAL, SQL_FLOAT, SQL_DOUBLE | float |
decimal, numeric | SQL_DECIMAL, SQL_NUMERIC | decimal.Decimal |
1-byte text | SQL_CHAR | unicode via UTF-8 (1) |
2-byte text | SQL_WCHAR | unicode via UTF-16LE (1) |
binary | SQL_BINARY, SQL_VARBINARY | bytearray |
date | SQL_TYPE_DATE | datetime.date |
time | SQL_TYPE_TIME | datetime.time |
SQL Server time | SQL_SS_TIME2 | datetime.time |
timestamp | SQL_TIMESTAMP | datetime.datetime |
UUID / GUID | SQL_GUID | unicode or uuid.UUID (2) |
XML | SQL_XML | unicode |
- The encoding and the Python type can be changed using Connection.setdecoding(). See the Unicode page for more information.
- The default is
unicode
. Setting pyodbc.native_uuid to True will cause them to be returned as uuid.UUID objects.
Note that these are pyodbc 4.x data types. Earlier versions returned str
objects for
SQL_CHAR buffers and performed no decoding. SQL_WCHAR buffers were assumed to be UCS-2.