SQLException.getSQLState 的所有可能值是啥?

Posted

技术标签:

【中文标题】SQLException.getSQLState 的所有可能值是啥?【英文标题】:What are all the possible values for SQLException.getSQLState?SQLException.getSQLState 的所有可能值是什么? 【发布时间】:2010-11-26 20:10:35 【问题描述】:

SQLException.getSQLStateSQLException 对象检索 SQLState。此方法可以返回的所有可能值是什么?我是否可以使用该值来识别数据库中发生的特定错误(即,该值是否可以告诉我这是违反 PK、唯一约束还是列值太大等)?

另外,DatabaseMetaData.getSQLStateType() 方法应该指示SQLException.getSQLState 返回的SQLSTATE 是 X/Open(现在称为 Open Group)SQL CLI 还是 SQL99。唯一可能的值应该是DatabaseMetaData.sqlStateXOpen == 1DatabaseMetaData.sqlStateSQL99 == 2,但我得到的值是0。我错过了什么吗?

有没有一种方法可以使用上述方法的组合来确定数据库中发生的特定类型的错误?我可以指望SQLException.getSQLState 的值吗?这些值是否因数据库提供者而异?

【问题讨论】:

See also this answer 【参考方案1】:

这在某种程度上依赖于 JDBC 驱动程序。似乎确实存在标准值,以及一些专有值。

作为可能的指南,Spring 的 JDBC 层包括 SQL 错误代码和状态转换。它提供了一个SQLState translator,它提供了相当模糊的异常翻译,以及一个更细粒度的SQLErrorCode translator,使用已知的专有错误代码。

如果你不能使用Spring,那就下载源代码,解压sql-error-codes.xml文件,里面包含了代码到异常类型的映射关系。

【讨论】:

【参考方案2】:

显然可以以相对较高的价格从 ANSI 和 XOpen 购买包含 SQLStates 的官方文档。 但是,大多数数据库的文档都有 SQLStates 列表。 DB2 手册中可能是最完整(并且易于访问)的在线列表。例如,检查DB2 Universal Messages manual。 Oracle(需要 TechNet 密码)和 Sybase 等也有在线列表。

至于第二个问题,这是SQLState的本意,但是各个数据库的合规程度不同。例如,有些将多个本机错误消息映射到同一个 SQLState。对于一般用途,人们可能应该专注于主要代码(SQLState 的前两个字符),然后确定次要代码中是否有更具体的信息(超过 000。)

http://www.jguru.com/faq/view.jsp?EID=46397

【讨论】:

【参考方案3】:

mysql 在Server Error Codes and Messages 的参考手册中提供了一些信息

【讨论】:

更新了 5.6 的链接:dev.mysql.com/doc/refman/5.6/en/server-error-reference.html 5.7:dev.mysql.com/doc/refman/5.7/en/server-error-reference.html 8.0:dev.mysql.com/doc/refman/8.0/en/server-error-reference.html【参考方案4】:

X/Open(现为 Open Group)标准现已免费提供(但需要注册)。 SQL CLI (aka ODBC) 标准见Data Management: SQL Call Level Interface (CLI),SQLSTATE 代码在附录A 中定义。SQL 标准Data Management: Structured Query Language (SQL), Version 2,SQLSTATE 代码在附录B 中定义。至于ISO 标准,虽然你需要付费对于正式版本,最终草案(几乎相同)是免费提供的; SQL:2011,见Final Committee Draft ISO/IEC FCD 9075-2的第2017页(按PDF编号;1194按文档页码)

【讨论】:

以上是关于SQLException.getSQLState 的所有可能值是啥?的主要内容,如果未能解决你的问题,请参考以下文章