MySQL异常处理浅析

MySQL异常处理浅析,第1张

MySQL的异常处理分析如下:

标准格式

DECLARE

handler_type

HANDLER

FOR

condition_value[,...]

statement

handler_type:

CONTINUE

|

EXIT

|

UNDO

--这个暂时不支持

condition_value:

SQLSTATE

[VALUE]

sqlstate_value

|

condition_name

|

SQLWARNING

|

NOT

FOUND

|

SQLEXCEPTION

|

mysql_error_code

condition_value细节

1、常用MYSQL

ERROR

CODE

列表

http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html

更多错误列表见MySQL安装路径下

比如我的/usr/local/mysql/share/mysql/errmsg.txt

说明一下:SQLSTATE

[VALUE]

sqlstate_value这种格式是专门为ANSI

SQL

ODBC以及其他的标准.

并不是所有的MySQL

ERROR

CODE

都映射到SQLSTATE。

2、如果你不想插ERROR

CODE的话,就用速记条件来代替

SQLWARNING

代表所有以01开头的错误代码

NOT

FOUND

代表所有以02开头的错误代码,当然也可以代表一个游标到达数据集的末尾。

SQLEXCEPTION

代表除了SQLWARNING和NOT

FOUND

的所有错误代码

3、我们现在就用手册上的例子

CREATE

TABLE

t

(s1

int,primary

key

(s1))

mysql>

use

t_girl

Database

changed

mysql>

CREATE

TABLE

t

(s1

int,primary

key

(s1))

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

mysql>

mysql>

DELIMITER

||

mysql>

CREATE

PROCEDURE

handlerdemo

()

->

BEGIN

->

DECLARE

EXIT

HANDLER

FOR

SQLSTATE

'23000'

BEGIN

END

--

遇到重复键值就退出

->

SET

@x

=

1

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

2

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

3

->

END||

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

DELIMITER

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

2

|

+------+

1

row

in

set

(0.00

sec)

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

1

|

+------+

1

row

in

set

(0.00

sec)

mysql>

现在来看一下遇到错误继续的情况

mysql>

truncate

table

t

Query

OK,

0

rows

affected

(0.01

sec)

mysql>

DELIMITER

$$

mysql>

DROP

PROCEDURE

IF

EXISTS

`t_girl`.`handlerdemo`$$

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

CREATE

DEFINER=`root`@`localhost`

PROCEDURE

`handlerdemo`()

->

BEGIN

->

DECLARE

CONTINUE

HANDLER

FOR

SQLSTATE

'23000'

BEGIN

END

->

SET

@x

=

1

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

2

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

3

->

END$$

Query

OK,

0

rows

affected

(0.01

sec)

mysql>

DELIMITER

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

3

|

+------+

1

row

in

set

(0.00

sec)

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

3

|

+------+

1

row

in

set

(0.00

sec)

mysql>

可以看到,始终执行到最后。

当然,上面的SQLSTATE

'23000'可以替换为1062

我们来看一下警告。

mysql>

alter

table

t

add

s2

int

not

null

Query

OK,

0

rows

affected

(0.01

sec)

Records:

0

Duplicates:

0

Warnings:

0

此列没有默认值,插入的时候会出现警告或者1364错误提示。

mysql>

DELIMITER

$$

mysql>

DROP

PROCEDURE

IF

EXISTS

`t_girl`.`handlerdemo`$$

Query

OK,

0

rows

affected,

1

warning

(0.00

sec)

mysql>

CREATE

DEFINER=`root`@`localhost`

PROCEDURE

`handlerdemo`()

->

BEGIN

->

DECLARE

CONTINUE

HANDLER

FOR

1062

BEGIN

END

->

DECLARE

CONTINUE

HANDLER

FOR

SQLWARNING

->

BEGIN

->

update

t

set

s2

=

2

->

END

->

DECLARE

CONTINUE

HANDLER

FOR

1364

->

BEGIN

->

INSERT

INTO

t(s1,s2)

VALUES

(1,3)

->

END

->

SET

@x

=

1

->

INSERT

INTO

t(s1)

VALUES

(1)

->

SET

@x

=

2

->

INSERT

INTO

t(s1)

VALUES

(1)

->

SET

@x

=

3

->

END$$

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

DELIMITER

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

*

from

t

+----+----+

|

s1

|

s2

|

+----+----+

|

1

|

3

|

+----+----+

1

row

in

set

(0.00

sec)

遇到错误的时候插入的新记录。

mysql>

select

@x

+------+

|

@x

|

+------+

|

3

|

+------+

1

row

in

set

(0.00

sec)

1.停止mysql服务:

右键点击“我的电脑”图标,出现右键菜单后左键点击“管理”。d出“电脑管理”对话框后,左键点击“服务与程序”,接着点击“服务”,最后找到mysql服务并将其关闭。

2.进入控制面板,点击卸载程序,进入卸载程序对话框后卸载mysql。

3.组合键W+R进入运行,输入“regedit”,查看下面  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 的键值,将mysql键值(mysql、mysqladmin)删掉 。

4.重启系统。

5.再次安装mysql程序。

flask中向mysql中数据 *** 作会出现字符集的问题,比如创建数据模型:db.create_all()时,控制台会出现warring 1366 的字符集警告,是这样的:

这个异常是mysql问题,而非python的问题,这是因为mysql的字段类型是utf-xxx, 而在mysql中这些utf-8数据类型只能存储最多三个字节的字符,而存不了包含四个字节的字符。

解决方法:

修改mysql数据表的字段类型为utf8mb4,只有在mysql5.5之后可以支持。

在flask配置中设置字符集:

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8"

首先明确自己提前开启了mysql服务的情况下遇到这个错误(这样就排除了因为mysql服务没开的原因)。

方法一就是关闭防火墙:计算机——>打开控制面板——>系统和安全——>

Windows防火墙——>打开或者关闭防火墙

然后关闭防火墙,点击确定,重启电脑就行了。

下面连接就是关闭防火的图文详解过程(标题是LOL相关的,内容是关闭防火墙):

16lol"服务器连接异常,即将退出..."解决方案

mysql 10038错误解决方案

END

方法二:新建一个规则

方法一简单粗暴,但这样做可能会让人觉得电脑不安全(其实还好,关闭了几个月玩LOL也没见有什么,毕竟杀毒软件还开着)。

而方法二虽然比方法一麻烦,但总体也是很简单的。

计算机——>打开控制面板——>系统和安全——>

Windows防火墙——>高级设置。出现如下图:先选择入站规则,再点击新建规则。

mysql 10038错误解决方案

选择规则类型,然后端口,点击下一步。

mysql 10038错误解决方案

输入mysql的默认端口号3306,然后选择下一步。

mysql 10038错误解决方案

选择允许连接,然后点击下一步。

mysql 10038错误解决方案

按照默认选择3个打上勾,点击下一步。

mysql 10038错误解决方案

为你的新规则起个名字(可以随意取,但必须填),描述可写可不写,点击完成,这样就OK了,在入站规则中也能找到“3306新规则”。

mysql 10038错误解决方案

上面的步骤完成其实就OK了,接下来连接mysql试试,发现成功了。到此就全部结束了,如果对你有帮助,随手来个赞啊,有得啊什么的都是极好的。

如果还有疑问,可以点击右上方剑豪图标查看更多经验,可以私信,共同探讨。

mysql 10038错误解决方案


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8687966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存