MySQL JOIN操作报错问题小解_weixin_30546933的博客-程序员秘密

 

1 问题描述

在调用一个MySQL存储过程的时候,有时候会出现下面的错误:

Illigal mix of collations(gbk\_chinese\_ci, IMPLICIT) and (latin1\_swedish\_ci, IMPLICIT) for operation '='

我从去年到现在遇到了很多这个问题,这篇文章做一下解决方法的总结,基本上能覆盖这个问题的所有解法

2 问题根源

这个问题的出现是由于JOIN操作时=操作符的左右参数的字符编码不一致导致导致的,解决问题的方法也基于此

3 问题解法

存储过程的代码千奇百怪,导致这个问题的原因也有多种多样。下面就由浅入深地谈谈这个问题的解法

3.1 step1

遇到这个问题首先要做的,就是要查看存储过程中JOIN操作的两列的字符编码是否一致,如果其中一个是GBK,另一个是UTF8,那就要统一这两列的字符编码,具体修改成哪个, 看你的应用场景,一般情况下,建议使用UTF8,GBK更容易被SQL攻击,没有中文的数据时,就不要使用GBK了。

3.2 step2

如果step1修改后还是不能解决上面的问题,那您就需要查看一下您的存储过程中是否有where条件,很可能是您的where条件中=左右两侧的数据编码不一致,通过 show variables like '%character%' 命令查看client的编码是否跟database的编码一致。

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | gbk                        |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | gbk                        |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

3.3 step3

上面的调整基本上能解决大部分此类问题,但是我们的存储过程依然执行不了。经过一番分析,发现我们的存储过程中会新建一个临时表,代码大概是这样:

INSERT INTO tmp(region, cell, relation)
SELECT DISTINCT r.region, t.cell, -1
FROM rr_tmp r LEFT JOIN ( SELECT DISTINCT region, cell FROM ri_tmp ri, ce_tmp ct WHERE ri.region=ce.region) t
ON r.region=t.region WHERE r.region is null;

我们怀疑字符编码不一致的原因是这个临时表的字符编码与rr_tmp表的字符编码不一致导致的,但是如何控制临时表的字符编码呢?

临时表的字符编码其实就是数据库的默认字符编码,通过 show create database test_db 可以看到数据库的字符编码 将数据库的字符编码修改成与rr_tmp的字符编码一致,就OK了 

alter database test_db characeter set utf8

 

Date: 2015-02-04T15:58+0800

Author: CobbLiu

Org version 7.9.3f with Emacs version 24

转载于:https://www.cnblogs.com/cobbliu/p/4272606.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30546933/article/details/96362159

智能推荐

MIT 6.828 2018 Lab 1 Booting a PC Part 1-2_Night_Thief的博客-程序员秘密

Lab 1 Booting a PCPart 1: PC Bootstrap首先,你需要熟悉x86的汇编语言本次实验使用GNU 编译器, 生成的汇编代码是 AT&T格式的Exercise 1. Familiarize yourself with the assembly language materials available on the 6.828 reference pag...

云计算10个入门基础知识_云计算基础知识_GLAB-Mary的博客-程序员秘密

云计算的概念出现之后受到众多企业和个人热捧和追逐,那云计算到底是什么呢,云计算能够为我们解决什么问题?针对入门学习者,整理了10个基础知识点供大家参考。1、云计算到底为何物?在互联网的时候天天听到各大媒体阐述云计算的概念,国内的什么华为云、百度云、腾讯云等,国外的亚马孙云、谷歌云、微软云,还有国内第一的阿里云,到底什么是云计算呢?云计算给大家提供了一种服务模式,其实就类似自来水一样。未来你想获得什么东西,不需要有很大的硬盘,也不需要你的电脑有非常强的处理能力,只要需要,随时随地可以获得。这种新型计算,在

echarts x、y轴设置了interval最后一项标签字体变粗的问题_echart 标签字体加粗_元仙僧的博客-程序员秘密

interval不仅仅可以是数值,也可以是函数axisLabel:{interval:(i,v)=> true}这样就可以了

python爬虫抓取全国pm2.5的空气质量(2015.12.21版)_djd已经存在的博客-程序员秘密

这个编码格式真的是很闹心啊,看来真的得深入学习一下编码格式,要不这各种格式错误。这个编码还和编辑器有关系,最开始的时候实在sublime Text里编辑的代码,运行起来卡卡的,特别顺畅,但突然发现它不支持raw_input和input,所以令临时换到了python官方提供的idle中。之后就出现了各种奇葩编码错误。。。。。。程序大概意思就是,你输入一个城市的拼音,它就会返回这个城市的空气污

apache_hive_2.1.1安装部署_yinlei_81的博客-程序员秘密

一、Hive 运行模式与 Hadoop 类似,Hive 也有 3 种运行模式:1. 内嵌模式将元数据保存在本地内嵌的 Derby 数据库中,这是使用 Hive 最简单的方式。但是这种方式缺点也比较明显,因为一个内嵌的 Derby 数据库每次只能访问一个数据文件,这也就意味着它不支持多会话连接。2. 本地模式这种模式是将元数据保存在本地独立的数据库中(一般是 MySQ

android APP 启动传入参数_goldxclub的博客-程序员秘密

android  APP  启动传入参数adb shell am start -n com.ledon.ledongym/.activity.StartActivity --es way "second"com.ledon.ledongym     com.ledon.ledongym.activity.StartActivity     参数 way   值 seco

随便推点

python爬虫学习(一):使用python获取网页标题_lulu_陌上尘的博客-程序员秘密

代码如下:import requestsfrom lxml import etreeheaders = {‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36’}response = requests.get(‘https://blog.csdn.net/it_xf?viewmode=c

WdatePicker 日期限制 和小时限制的问题_xiangshui021的博客-程序员秘密

将minDate设置为:'%y-%M-%d 00:00:00',这样当前时间之前的时间就不会再被限制了onfocus="WdatePicker({minDate:'%y-%M-%d 00:00:00',startDate:'%y-%M-01 00:00',dateFmt:'yyyy-MM-dd HH:mm',alwaysUseStartDate:true})"

springboot整合mongodb_从哪里跌倒,就在哪里躺下的博客-程序员秘密

1、介绍:MongoDB是介于关系型数据库和非关系型数据库中间的一个产品,是非关系型数据库中最丰富的,最像关系型数据的。2、与redis对比Redis:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,在set,hash等数据结构的存储。Redis支持数据的备...

内存性能测试工具-程序员秘密

与CPU的重要性类似,内存也是一个计算机系统中最基本、最重要的组件,因为任何应用程序的执行都需要用到内存。将内存密集型的应用程序分别在非虚拟化的原生系统和KVM客户机中运行,然后根据它们的运行效率就可以粗略评估KVM的内存虚拟化性能。对于内存的性能测试,可以选择CPU性能测试工具提到的SPECjbb2015、SysBench、内核编译等基准测试(因为它们同时也是内存密集型的测试),还可以选择LMbench、Memtest86+、STREAM等测试工具。下面简单介绍几种内存性能测试工具。1. LMbench

hexo博客_weixin_34040079的博客-程序员秘密

一劳永逸的搞定 flex 布局寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平、垂直同时居中。记得刚开始学习 CSS 的时候,看到 float 属性不由得感觉眼前一亮,顺理成章的联想到 Word 文档排版中用到的的左对齐、右对齐和居中对齐,然而很快就失望的发现 CSS 中并不存…读书笔记 - 你不知道的 ...

迅雷专用链接原理及转换_weixin_30822451的博客-程序员秘密

对于迅雷专用链接不用我去解释相信大家都明白(别告诉我你不懂~汗),现在就链接的编码原理及转换详细说明一下,明白以后就可以用迅雷下载快车、旋风专用地址的软件啦。首先要明白Base64编码是怎么一回事,不懂的先去百度一下再回来。 Base64编码是一种加密算法,Email的原始信息就是由Base64编码构成的。 而这些专用链接都是通过Base64编码加工转换而成的。迅雷专用地址例子:thund...

推荐文章

热门文章

相关标签