Connector/C++ 与 JDBC 4.0 API 兼容。有关 JDBC 4.0 的信息,请参阅
JDBC 概述。另请检查examples
下载包的目录。
-
Connector/C++
sql::DataType
类定义了以下 JDBC 标准数据类型 :UNKNOWN
,BIT
,TINYINT
,SMALLINT
,MEDIUMINT
,INTEGER
,BIGINT
,REAL
,DOUBLE
,DECIMAL
,NUMERIC
,CHAR
,BINARY
,VARCHAR
,VARBINARY
,LONGVARCHAR
,LONGVARBINARY
,TIMESTAMP
,DATE
,TIME
,GEOMETRY
,ENUM
,SET
。SQLNULL
Connector/C++ 不支持以下 JDBC 标准数据类型:
ARRAY
,BLOB
,CLOB
,DISTINCT
,FLOAT
,OTHER
,REF
,STRUCT
。 DatabaseMetaData::supportsBatchUpdates()
返回true
,因为 MySQL 通常支持批量更新。但是,Connector/C++ API 不提供用于批量更新的 API 调用。-
两个非 JDBC 方法允许您获取和设置无符号整数:
getUInt64()
和getUInt()
。这些可用于ResultSet
和Prepared_Statement
:ResultSet::getUInt64()
ResultSet::getUInt()
Prepared_Statement::setUInt64()
Prepared_Statement::setUInt()
-
该
DatabaseMetaData::getColumns()
方法在其结果集中有 23 列,而不是 JDBC 定义的 22 列。前 22 列如 JDBC 文档中所述,但第 23 列是新的:23.
IS_AUTOINCREMENT
: 一个字符串, 如果该列是自增列 则为“ YES ” ,否则为“ NO ”。 -
Connector/C++ 可能会为同一列返回不同的元数据,具体取决于您调用的方法。
假设您有一个列在其规范中接受字符集和排序规则,并且您指定了二进制排序规则,例如:
VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_bin
服务器
BINARY
在该列的结果集元数据中设置标志。由于标志,该ResultSetMetaData::getColumnTypeName()
方法使用元数据和报告,BINARY
列类型名称为BINARY
,如下所示:mysql> CREATE TABLE varbin (a VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_bin); Query OK, 0 rows affected (0.00 sec) mysql> select * from varbin; Field 1: `a` Catalog: `def` Database: `test` Table: `varbin` Org_table: `varbin` Type: VAR_STRING Collation: latin1_swedish_ci (8) Length: 20 Max_length: 0 Decimals: 0 Flags: BINARY 0 rows in set (0.00 sec) mysql> SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='varbin'\G *************************** 1. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: test TABLE_NAME: varbin COLUMN_NAME: a ORDINAL_POSITION: 1 COLUMN_DEFAULT: NULL IS_NULLABLE: YES DATA_TYPE: varchar CHARACTER_MAXIMUM_LENGTH: 20 CHARACTER_OCTET_LENGTH: 60 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: utf8 COLLATION_NAME: utf8_bin COLUMN_TYPE: varchar(20) COLUMN_KEY: EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT: 1 row in set (0.01 sec)
但是,
INFORMATION_SCHEMA
在其COLUMNS
表中没有暗示元数据将包含该BINARY
标志。DatabaseMetaData::getColumns()
使用INFORMATION_SCHEMA
并将报告VARCHAR
同一列的类型名称。它还返回不同的类型代码。 -
在插入或更新
BLOB
或TEXT
列时,建议 Connector/C++ 开发人员不要使用setString()
. 相反,使用专用的setBlob()
API 函数。使用
setString()
会导致 Packet too large错误消息。setString()
如果传递给使用的连接器的字符串长度超过max_allowed_packet
(减去协议中为控制目的保留的几个字节),则会发生错误。这种情况在 Connector/C++ 中没有得到处理,因为它可能会导致安全问题,例如由于恶意的长字符串而导致的非常大的内存分配请求。如果
setBlob()
使用,则不会出现此问题,因为setBlob()
采用了基于std::istream
.max_allowed_packet
将数据从流发送到 MySQL 服务器时,Connector/C++ 使用当前设置 将流拆分为适合服务器的块 。警告使用 时
setString()
,无法在max_allowed_packet
将字符串传递给 Connector/C++ 之前将其设置为足够大的值。该配置选项不能在会话中更改。这种与 JDBC 规范的差异确保了 Connector/C++ 不易受到内存溢出攻击。
-
一般而言,Connector/C++ 可与 MySQL 5.0 配合使用,但并不完全支持。连接 MySQL 5.0 时,某些方法可能不可用。这是因为 Information Schema 用于获取请求的信息。没有计划改进对 5.0 的支持,因为当前 MySQL 的 GA 版本是 5.6。Connector/C++ 主要针对发布时可用的 MySQL GA 版本。
sql::MethodNotImplemented
当您连接到低于 5.1 的 MySQL 服务器时 ,以下方法会抛出 异常:DatabaseMetaData::getCrossReference()
DatabaseMetaData::getExportedKeys()
-
Connector/C++ 包含
Connection::getClientOption()
JDBC API 规范中未包含的方法。原型是:void getClientOption(const std::string & optionName, void * optionValue)
该方法可用于在建立数据库连接时检查连接属性设置的值。这些值通过
optionValue
传递给方法的参数返回,类型为void *
。目前,
getClientOption()
支持获取optionValue
以下选项:metadataUseInfoSchema
defaultStatementResultType
defaultPreparedStatementResultType
metadataUseInfoSchema
connection 选项控制是否使用Information_Schemata
for 返回SHOW
语句 的元数据:对于
metadataUseInfoSchema
,返回时将参数解释optionValue
为布尔值。对于
defaultStatementResultType
anddefaultPreparedStatementResultType
,返回时将参数解释optionValue
为整数。
连接属性可以在通过连接属性映射建立连接时设置,也可以使用
void Connection::setClientOption(const std::string & optionName, const void * optionValue)
whereoptionName
赋值metadataUseInfoSchema
。一些例子:
bool isInfoSchemaUsed; conn->getClientOption("metadataUseInfoSchema", (void *) &isInfoSchemaUsed); int defaultStmtResType; int defaultPStmtResType; conn->getClientOption("defaultStatementResultType", (void *) &defaultStmtResType); conn->getClientOption("defaultPreparedStatementResultType", (void *) &defaultPStmtResType);
-
为了获取和设置 MySQL 会话变量,Connector/C++ 支持以下
MySQL_Connection
JDBC API 标准中没有的方法:std::string MySQL_Connection::getSessionVariable(const std::string & varname)
void MySQL_Connection::setSessionVariable(const std::string & varname, const std::string & value)
getSessionVariable()
等同于执行以下并获取第一个返回值:SHOW SESSION VARIABLES LIKE 'var_name'
您可以在 中使用
%
和_
SQL 模式字符var_name
。setSessionVariable()
相当于执行:SET SESSION var_name = value
-
获取列的值有时会返回不同的值,具体取决于调用是从 Statement 还是 Prepared Statement 进行的。这是因为用于与服务器通信的协议根据使用的是 Statement 还是 Prepared Statement 而不同。
为了说明这一点,请考虑列已定义为 type 的情况
BIGINT
。然后将最负值BIGINT
插入列中。如果创建执行getUInt64()
调用的 Statement 和 Prepared Statement,则每种情况下的结果都会不同。该语句返回 的最大正值BIGINT
。准备好的语句返回 0。不同之处在于 Statements 使用文本协议,而 Prepared Statements 使用二进制协议。在这种情况下使用二进制协议,从服务器返回一个二进制值,可以将其解释为
int64
. 在前面的场景中,使用 获取一个非常大的负值getUInt64()
,它获取无符号整数。由于较大的负值无法合理地转换为无符号值,因此返回 0。对于使用文本协议的语句,值作为字符串从服务器返回,然后根据需要进行转换。当在前面的场景中从服务器返回一个字符串值时,大的负值必须由调用的运行时库函数
strtoul()
转换getUInt64()
。的行为strtoul()
取决于特定的运行时和主机操作系统,因此结果可能取决于平台。在这种情况下,实际上返回了一个很大的正值。虽然这种情况非常罕见,但在某些情况下,Statements 和 Prepared Statements 可能会意外地返回不同的值,但这通常只会发生在极端情况下,例如上述情况。
-
JDBC 文档 列出了 该类的许多字段。
DatabaseMetaData
JDBC 似乎也 为这些字段定义了某些值。但是,Connector/C++ 没有为这些字段定义某些值。在内部使用枚举,编译器确定分配给字段的值。要将值与字段进行比较,请使用如下代码,而不是对属性的特定值进行假设:
// dbmeta is an instance of DatabaseMetaData if (myvalue == dbmeta->attributeNoNulls) { ... }
通常
myvalue
是保存元数据信息的结果集中的一列。Connector/C++ 不保证attributeNoNulls
为 0。它可以是任何值。 在编写存储过程时,JDBC 提供了一个额外的类,一个用于可调用语句的额外抽象层,
CallableStatement
类。由于此类在 Connector/C++ 中不存在,因此使用Statement
和PreparedStatement
类中的方法来执行使用CALL
.