Delphi应用通过ADO与ODBC驱动连接远程MariaDB时,Windows 8/Vista系统插入西里尔字符报"Incorrect string value"错误排查
首先,这个问题的核心是编码转换不匹配:Win10系统对Unicode的处理更完善,而Win8/Vista上ODBC驱动默认的字符集设置和系统编码交互时出现了双重编码,导致数据库收到格式错误的字符串(报错里的\xC2\xC2\xC8就是典型的Windows-1251字符被错误转成UTF-8的结果)。下面是具体的解决方案:
1. 强制连接串指定字符集(最关键)
你的连接串里没有明确设置数据库字符集,ODBC驱动在不同系统上可能会默认使用系统编码(比如Win8/Vista上的Windows-1251)来转换字符串,而非数据库需要的UTF-8。修改连接串,添加Charset=utf8参数:
procedure OpenDBConnection; begin dmMain.dbConnection.Connected := False; dmMain.dbConnection.ConnectionString := Format( 'Driver={MySQL ODBC 8.0 Unicode Driver};Port=%s;Server=%s;Database=%s;User=%s;Password=%s;Charset=utf8;', [Port, Server, Database, User, Password]); dmMain.dbConnection.Connected := True; end;
这个参数会强制驱动以UTF-8编码与数据库通信,彻底避免系统默认编码的干扰。
2. 确保Delphi字符串为Unicode格式
如果你使用的是Delphi 2009及以后版本(默认字符串类型为UnicodeString),请确认Equip.Name是UnicodeString类型,不要使用AnsiString。如果是旧版Delphi,需要手动将西里尔字符串转成UTF-8编码后再传入参数:
cmdTemp.Parameters.ParamByName(colEquipName).Value := UTF8Encode(Equip.Name);
不过从你Win10运行正常的情况来看,应该用的是Unicode版本Delphi,这一步可能不需要,但可以做个确认。
3. 检查Win8/Vista上的ODBC驱动版本
ODBC 8.0 Unicode Driver的旧版本在Win8/Vista上可能存在编码转换bug,建议下载并安装兼容Win8/Vista的最新版MySQL ODBC驱动(注意选Unicode版本,而非ANSI版本),确保驱动本身的编码处理逻辑正常。
4. 可选:验证数据库字符集兼容性
虽然你的数据库已设置为utf8_bin,但MariaDB的utf8实际是utf8mb3(仅支持BMP字符),西里尔字符属于BMP范围,所以没问题。如果以后需要支持emoji等扩展字符,可以考虑把库和表的字符集改成utf8mb4,排序规则用utf8mb4_bin,不过这不是解决当前问题的必需步骤。
测试验证
修改连接串后,在Win8/Vista上测试插入西里尔字符:
- 如果仍报错,可以手动用MySQL命令行工具插入相同的西里尔字符串,确认数据库本身能正常接收;
- 检查系统「区域和语言」设置里的「非Unicode程序的语言」,如果设置为俄语,一般不需要修改,但驱动已指定Charset,所以影响不大。
内容的提问来源于stack exchange,提问作者m1know

