【发布时间】:2021-06-09 12:56:43
【问题描述】:
我正在开发与远程 MariaDB 数据库通信的 Delphi 应用程序(通过 ADO 和 ODBC 驱动程序)。发现在某些计算机上无法将西里尔字符串添加到 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
字符集是 utf8,整理 - 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;
【问题讨论】:
-
包括您与数据库连接的代码,并确保您使用 UTF-8 与您的数据库通信。如果您不执行后者,则很可能取决于驱动程序的默认设置。这看起来像 ISO-8859-5:
ТТШ ёш -
@AmigoJack,谢谢你的回复,我用代码更新问题。
-
今天也尝试在其他虚拟机上运行 Windows 10 - 它可以工作,但在 Windows 7 或 Vista 上 - 不行。再加上这些机器上的 MDAC 更新到 2.8 - 没有结果。
-
正如我所担心的那样:你无处可说你正在使用 UTF-8。考虑在建立与数据库的连接后执行
SET NAMES utf8mb4。另请阅读UTF-8 all the way through。 -
如果通过代码
cmdTemp.Parameters.ParamByName(colEquipName).DataType := ftWideString;将参数类型设置为ftWideString,那么它工作正常。但是虽然很奇怪 - 相同的代码在 Windows 10 上工作,但在旧操作系统上不工作。
标签: mysql delphi mariadb odbc charset