1. 什么是SQLSTATE

shell> SELECT * FROM no_such_table;

ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist

上面执行一条SQL语句出错后的显示。1146是MySQL自己定义的错误码,42S02是ANSI SQL和ODBC定义的错误码,“Table 'test.no_such_table' doesn't exist”是MySQL返回的错误原因。

其中,42S02就是本文要讨论的SQLSTATE

2. 为什么要有SQLSTATE

42S02是ANSI SQL和ODBC定义的错误码,可以理解成是错误码标准。假设没有SQLSTATE,世界会是什么样子?你开发了一款数据库驱动程序,希望兼容MySQL、Oracle、SQLServer。对于锁冲突,MySQL返回错误码2011,Oracle返回9912,SQLServer返回3231(以上3个数据为杜撰),如果你希望检查到锁冲突后,立即执行do_something(),那你需要这样写代码:

if (2011 == conn.errno || 9912 == conn.errno || 3231 == conn.errno) {

do_something();

}

如果还希望支持Postgre,则需要增加Postgre的错误码处理。这是个悲伤地故事,不想再讲。

可见,数据库自定义错误码是靠不住的,他们各自为政。也许你会想,为什么这些数据库厂商不能协调一下,统一一下错误码呢?理想很丰满,现实很骨感。因为在某个特定数据库内部实现中,可能内部定义了四五个不同的错误码来表示锁冲突,用一个错误码无法满足内部逻辑的需求。所以,完美的解决方式是:

*. 内部,用数据库自己的错误码,爱怎么用就怎么用,当需要把这个错误码输出到外部的时候,先做一个转换,将内部错误码转换成SQLSTATE。

*. 数据库驱动程序只看SQLSTATE,忽略数据库自定义错误码。

3. SQLSTATE数据格式详解

SQLSTATE包含5个字母,前两位表示错误类别,后三位表示子类,均有0~9,A~Z(大写)这些字符组成。00000表示没有错误。

前两个字母定义的错误类别:

00 = 没有错误

01 = 有WARNING

02 = 游标NOT FOUND

> 02 表示某种异常,MySQL的异常,详细见http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html  这里定义了MySQL内部800多个错误码与SQLSTATE的映射

并不是每一个内部错误码都能明确映射到一个有意义的SQLSTATE,对于这一类内部错误码,统统都映射到HY000这个SQLSTATE上去,意思就是:我也不知道咱们这个错误码对应哪个SQLSTATE好,就这么凑合着吧。例如:Error: 1004 SQLSTATE: HY000 (ER_CANT_CREATE_FILE)

关于SQLSTATE的格式,还有很多讲究,详细参考这篇文档,比较清晰:https://mariadb.com/kb/en/sql-99/sqlstate-codes/

4. 数据库中如何实现SQLSTATE

可以创建一个Map,将错误码映射到SQLSTATE即可。如果错误码的规划设计正好是从0~N,或者0~-N,那么可以直接用数组来实现这个映射,错误码即为数组的下标;更通用的方式,还是用数组,只不过查找方式是二分查找,也很方便。

MySQL中的实现,详见share/errmsg.txt和include/sql_state.h 。

5. OceanBase中如何实现SQLSTATE

参见lib/ob_errno.cpp

可以看到,与MySQL相比,OB还多了一个负担:把OceanBase内部错误码尽可能映射成MySQL内部错误码。啥时候别人写数据库的时候能把内部错误码映射成OceanBase的啊?

学习SQLSTATE相关推荐

  1. php部署项目到服务器报错SQLSTATE[HY000] [2002] Connection timed out解决方法(纯学习笔记,不作为教程)

    SQLSTATE[HY000] [2002] Connection timed out解决方法 在网上找了一堆,结果全部是错的 后来,我明白了其实是设置问题. 当你的代码部署到服务器里的时候,你的my ...

  2. ODBC API 学习总结

    ODBC 编程API http://blog.csdn.net/bichenggui/article/details/5601381 转的ODBC API函数详细说明. 看了一遍,没有问题. 使用 O ...

  3. mysql between and的用法的意思_从入门到入土:MySQL完整学习指南,包教包会!

    精彩推荐 一百期Java面试题汇总SpringBoot内容聚合IntelliJ IDEA内容聚合Mybatis内容聚合 一SQL 介绍 SQL(Structured Query Language),语 ...

  4. 【DB2学习文档之七】SQL for DB2

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.SQL的数据操作语言data manipulation language (DML) 参见Beginning ...

  5. 从入门到入土:MySQL完整学习指南,包教包会!

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 一SQL 介绍 SQL(Structured Query Language ...

  6. SQLSTATE[HY000]: General error: 1366 Incorrect string value: ‘\xF0\x9F\x98\x84‘ for column ‘content‘

    事件前瞻:由于学习workerman来做socket通讯,所以做了一个类似与客服的系统,图片什么的都能存,唯独存入输入法里面的表情,确报错,报错内容:SQLSTATE[HY000]: General ...

  7. mysql 学习指南

    一 SQL介绍 SQL是结构化语言 是一门ANSI的标准计算机语言 用来访问和操作数据库系统 二 数据库介绍 2.1 数据库 我们已经知道了SQL是操作数据库的语言,那么数据库是什么?数据库(data ...

  8. Mysql学习总结十二:系统变量、用户变量、定义条件和处理程序

    Mysql学习总结十二:系统变量.用户变量.定义条件和处理程序 1.变量 1.1 系统变量 1.1.1 系统变量的分类 1.1.2 查看系统变量 1.2 用户变量 1.2.1 用户变量的分类 1.2. ...

  9. MySQL语法学习笔记

    MySQL语法学习笔记 学习之道,非尽心竭力者不能进也!我是小七黛,欢迎查看我的笔记,有问题欢迎交流探讨. SQL是一种结构查询语言,用于查询关系数据库的标准语言,包括若干关键字和一致的语法,便于数据 ...

最新文章

  1. Javascript原型链
  2. 在持续交付中加入自动化验收测试支持
  3. 【browser】chinese chrome shows as english
  4. etcd工作原理和CentOS 7部署指南
  5. codevs 4768 跳石头
  6. ubuntu常见问题
  7. c++ 工厂模式_大连中山融雪剂工厂自营工厂批发
  8. (5)vivado不能生成bit文件(学无止境)
  9. 今天听阿里P8讲完SpringBoot,瞬间感觉自己白学了……
  10. Maven学习总结(30)——Maven项目通用三级版本号说明
  11. centos6.5 install cobbler
  12. 汇编考试一星题目对字母操作,输入字符并在屏幕上显示
  13. javascript 高级编程系列 - 创建对象
  14. 文本数据增强(data augmentation)nlpaug使用
  15. 简谈二维码(QRcode)的C语言生成,在单片机平台的实现
  16. 空格、NBSP 造成的 JSON 解析失败问题
  17. Linux下Moudle工具的介绍与使用
  18. Python 编程案例:谁没交论文?输出并生成电子表格
  19. 如何拿到阿里offer的?面试流程及面试题
  20. 抖音seo矩阵系统,抖音矩阵系统源码怎么搭建?

热门文章

  1. Avisynth + DirectShow + WebCamera 实现Avisynth脚本访问摄像头
  2. xv6操作系统中添加用户应用程序
  3. 计算机新手教程装系统,新手怎么用u盘重装电脑系统|新手重装电脑系统
  4. FOSB|FOUP晶圆盒RF插件读写器CK-S650系列1协议说明
  5. win平台改代码到android 平台需要注意
  6. 基于SSM的“安家”儿童福利院管理系统(计算机毕业设计)
  7. 如何了解 ![CDATA[ ]]的作用?
  8. 打Oracle PSU时碰到的一些问题处理
  9. (javaweb基础
  10. QT中AES的初步测试使用