迁移FoxPro应用至MariaDB ODBC:COUNT(*)返回字符字段的问题求助
MariaDB ODBC驱动返回COUNT(*)为字符类型的问题解决
问题背景
将FoxPro应用从MySQL ODBC连接器迁移至MariaDB ODBC连接器时,所有COUNT(*)查询结果在FoxPro游标中被识别为字符类型(VARTYPE返回C),而非预期的数值类型,导致多处出现「数据类型不匹配」错误。
复现代码
LOCAL cConnectionString && 连接字符串针对默认XAMPP MariaDB服务器 cConnectionString = "Driver={MariaDB ODBC 3.1 Driver};SERVER=localhost;UID=root;DB=mydb;PORT=3306;OPTION=3" nOpt = "3" * 建立ODBC连接,失败则返回 lnConnection = SQLStringConnect(cConnectionString) cSQLQuery = "SELECT COUNT(id) as myCount from mytable" lnResult = SQLEXEC(lnConnection, cSQLQuery, "mycursor") IF lnResult > 0 SELECT mycursor typeOfCount = VARTYPE(mycursor.myCount) msg = "MyCount vartype (expected N): " + typeOfCount + " [" + ALLTRIM(mycursor.myCount) + "] - Option: " + nOpt && 无需STR(),已是字符串 MESSAGEBOX(msg) ELSE MESSAGEBOX("Error executing SQL query:"+MESSAGE()) ENDIF SQLDISCONNECT(lnConnection) RETURN && 程序结束
已尝试的无效方案
- 循环测试OPTION值1至332987,
myCount的VARTYPE始终为C; - 同步服务器配置至MySQL ODBC正常运行的环境,无效果;
- 单个查询使用
COUNT(*)/1强制转换有效,但应用中存在大量COUNT语句,维护成本高。
可行解决方法
1. 连接参数禁用BigInt映射
MariaDB ODBC驱动支持BIGINT=0参数,可将BigInt类型强制映射为Int类型,让FoxPro识别为数值类型。修改连接字符串:
cConnectionString = "Driver={MariaDB ODBC 3.1 Driver};SERVER=localhost;UID=root;DB=mydb;PORT=3306;OPTION=3;BIGINT=0"
该参数等效于MySQL ODBC的OPTIONS=16387功能,解决BigInt导致的类型识别问题。
2. 游标创建后批量修正字段类型
若上述参数无效,可通过DBSetProp批量修正游标字段类型:
IF lnResult > 0 SELECT mycursor FOR nField = 1 TO FCOUNT() cFieldName = FIELD(nField) * 仅修正数字型字符串字段 IF VARTYPE(&cFieldName) = "C" AND ISDIGIT(ALLTRIM(&cFieldName)) DBSetProp(cFieldName, "FIELD", "DataType", "N(18,0)") REPLACE &cFieldName WITH VAL(&cFieldName) ENDIF ENDFOR typeOfCount = VARTYPE(mycursor.myCount) msg = "MyCount vartype (now N): " + typeOfCount + " [" + STR(mycursor.myCount) + "] - Option: " + nOpt MESSAGEBOX(msg) ELSE MESSAGEBOX("Error executing SQL query:"+MESSAGE()) ENDIF
3. 升级MariaDB ODBC驱动
旧版本驱动可能存在BigInt类型描述的bug(SQLDescribeCol返回-5代表BigInt,而MySQL驱动返回4代表Int),升级至最新稳定版可修复此类兼容性问题。
内容的提问来源于stack exchange,提问作者Jose Ferrer
相关产品推荐
相关产品推荐

