我正在开发与远程 MariaDB 数据库通信的 Delphi 应用程序(通过 ADO 和 ODBC 驱动程序)。发现在某些计算机上无法将 Cyrillic 字符串添加到 DB。像这样的错误信息:
[MySQL][ODBC 8.0(w) Driver][mysqld-5.5.5-10.3.29-MariaDB]Incorrect string value: '\xC2\xC2\xC8 \xF1\xE8…' for column <here's target tables and columns name> at row 1
Charset is utf8
, collate - utf8_bin
。它在我的装有 Windows 10 的计算机上运行良好,但在装有 Windows 8 和 Vista 的计算机上触发了错误。因此,据我了解,问题不在数据库设置中,而在操作系统中。它可以是什么?也许是区域设置或类似的东西?
更新
桌子:
SHOW CREATE TABLE equip;
CREATE TABLE `equip` (
`eqid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`eqname` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Наименование оборудования',
PRIMARY KEY (`eqid`),
UNIQUE KEY `eqname_UNIQUE` (`eqname`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
连接到数据库:
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;',
[Port, Server, Database, User, Password]);
dmMain.dbConnection.Connected := True;
end;
将数据插入数据库:
const
tblEquip = 'equip';
colEquipName = 'eqname';
queryInsertEquipment =
' INSERT INTO ' + tblEquip + '(' +
colEquipName + ') ' +
'VALUES(:' +
colEquipName + '); ';
function TdmMain.AddEquipment(const Equip: TEquipment;
const RefreshEquipmentListDataSet: Boolean): Integer;
begin
Result := 0;
try
cmdTemp.CommandText := queryInsertEquipment;
cmdTemp.Parameters.ParamByName(colEquipName).Value := Equip.Name;
cmdTemp.Execute;
Result := GetLastID;
if RefreshEquipmentListDataSet then
RefreshDataSet(dsetEquipment, colEquipID, Result);
except on E: Exception do
fmMessage.ShowMessage(msgErrorAddEquipment, mtError);
end;
end;