美文网首页
MySQL中的坑

MySQL中的坑

作者: liuyialfred | 来源:发表于2017-09-04 15:14 被阅读0次

    一,Illegal mix of collations (gbk_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBL

    在MySQL上写了一个存储过程,但是我发现用#写完中文注释后,在保存时这些注释会消失。在觉得可能是编码问题导致识别不了中文语句,于是就直接将数据库的编码修改成为了gbk,但是并没有能够修复这个问题。

    相反,在运行原本正常的存储过程时,出现了诡异的报错:Illegal mix of collations (gbk_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBL...

    百度之后并没有合适的解决办法,阅读了stackoverflow上的这篇回答,里面介绍了MySQL本身的编码和字符比较体系,collation的设定保证了使用某种编码体系时可以正常进行字符之间的比较,包括bin/cs/ci几种,分别代表二进制字符比较(可以比较二进制字符和正常字符,大小写敏感)、大小写敏感、大小写不敏感三种比较方式。同时,这个回答给出了下面的描述:

    Literal expressions take the collation specified in the collation_connection system variable; values from tables take the collation specified in their column metadata.

    表达式会使用系统默认的collation_connection字符比较设定,而表内的值则会采取最初建表时给每个列设定的设定。

    接下来,我使用“show VARIABLES”命令查看了系统对应的变量,找到collation_connection,发现取值为latin1_swedish_ci,猜测应该是之前写存储过程时,默认使用的latin编码,但是后面我将数据库编码整体修改为了gbk_bin,导致了不同步。

    本来准备查一下是否有办法可以修改“collation_connection”,但是发现并没有特别便利的解决方案。

    于是,我就把数据库的编码模式回退到了“latin1”,并且将“collation_connection”设置为“latin1_swedish_ci”,于是问题解决了。

    二、MySQL客户端中的超时连接时间设置

    当用MySQL查询比较大的表时,如果使用客户端,会出现连接超时的报错情况,这种情况下,可以修改客户端上的超时时间。MySQL Workbench和Navicat不同。

    MySQL Workbench:

    Navicat:

    在需要修改的数据库上“右键->编辑连接”

    条件判断中的NULL,如果是某个字段取值A为NULL,在使用条件“A<>'0' ”之类的格式时,并不会返回NULL的行,目前还不清楚原因,猜测可能NULL和普通的取值不在一个比较体系里面,这种情况下,如果只是需要返回NULL对应的行,就用is NULL做判断就好了。

    相关文章

      网友评论

          本文标题:MySQL中的坑

          本文链接:https://www.haomeiwen.com/subject/wcjejxtx.html