我已阅读有关MySQL错误捕获/处理的多篇教程和文章。我读过的每个文档都提到,如果出现错误,我可以得到错误消息的文本,但是这些文档都没有提到我如何能够进一步详细说明错误,例如触发它的字段。
我的问题最好用一个例子来描述:
假设我有一个应用程序(放弃编程语言及其实际实现方式),它允许用户创建一个新帐户,并假设帐户数据包含电子邮件地址和登录名。当然,这两者必须是唯一的,因此可以创建包含帐户的表:
CREATE TABLE `Accounts` (
`Email` varchar(255) COLLATE utf8_bin NOT NULL,
`Login` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`Email`),
UNIQUE KEY `UNI_Login` (`Login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
现在假设会话执行以下操作:
INSERT INTO Accounts(Email, Login) VALUES ("E1", "L1");
INSERT INTO Accounts(Email, Login) VALUES ("E1", "L1");
--> ERROR 1062 (23000): Duplicate entry 'E1' for key 'PRIMARY'
第一个命令有效,第二个命令按预期失败。
现在,如果我想告知用户实际上是什么问题,我怎么能检测出来?换句话说,我怎么知道重复的电子邮件地址或重复的登录是否导致了失败?
当然,我不想直接向最终用户(非技术人员)提供MySQL错误消息。相反,在这种情况下,我想提供类似&#34的消息;此电子邮件地址已被其他帐户使用。"或者"您已经选择的登录名已分配给另一个帐户。"。为此,我必须知道哪个表的列字段导致了问题。
总结我到目前为止所读到的内容,唯一的方法是解析错误字符串。我不想这样做,主要是因为我可以想象下一版本的MySQL守护进程使用不同的错误号或错误字符串的不同格式,然后我将不得不重写应用程序的所有部分如果我想切换到新版本的守护程序,请处理错误处理并向用户报告错误。
请注意,我知道我可以使用事务并测试我想要插入的值是否已经在表中(实际上,这是我目前为止所做的),但这会导致其他问题向用户报告错误甚至更难以解决(如果对该主题感兴趣,我将发布另一个问题并从此处链接它,但是现在我想这样保持这个线程尽可能清晰)。
除了解析错误字符串之外的任何想法吗?