MySQL JOIN操作报错问题小解-程序员宅基地

 

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

智能推荐

【ASP.NET】6.百度富文本编辑器UEditor之从数据库中取出来页面展示_ueditor富文本从数据库得到的值怎么显示-程序员宅基地

文章浏览阅读1k次。 将数据存到数据库中了,那么怎么让数据原样显示到编辑器里呢?读取数据库里一条数据,获取到的数据是这样的:<p style="text-align:center;"> <img src="/LJWY/MGMT/attached/image/2016-11-08/2016-11-08100052_8293.jpg" alt="" /></p><_ueditor富文本从数据库得到的值怎么显示

xilinx 真双口RAM的primitives /core output 区别_core output register-程序员宅基地

文章浏览阅读5.4k次,点赞10次,收藏59次。软件平台Vivado 2016.4属性设置说明1在 ip catalog -> block memory generator .这里仅介绍真双口RAM,真双口RAM支持A/B两个口可读可写。属性1 operating mode包含 writing first(WF), reading first(RF), no chang(NC)三种模式参考手册如下:..._core output register

Java详解剑指offer面试题18--删除链表的结点_java创建一个单项循环链表,每经过三个结点,就删除第三个结点 → 找到最后遗留的一-程序员宅基地

文章浏览阅读213次。Java详解剑指offer面试题18——删除链表的结点题目一——O(1)删除链表结点给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点。假设要删除的结点确实在链表中。常规思路:删除某个结点需要找到该结点的前一个结点,由于单向链表没有指向前一个结点的指针,所以不得不从头指针开始遍历链表。显然时间复杂度为O(n)。实现如下:package Chap3;public class DeleteNode { private class Node { _java创建一个单项循环链表,每经过三个结点,就删除第三个结点 → 找到最后遗留的一

Unity - Ray射线检测_overlapspherenonalloc-程序员宅基地

文章浏览阅读3.2k次,点赞8次,收藏20次。一:Ray射线定义:射线是一条从原点出发,沿某一方向运动的无限直线。//创建一条初始位置为startPos,方向为dir的一条射线Ray ray = new Ray (startPos, dir);//创建一条从摄像机通过屏幕点的光线。//得到的光线在世界空间中,从相机的近平面开始,经过屏幕上的(x,y)像素坐标(位置)。z是忽略。Ray camerRay = Camera.main..._overlapspherenonalloc

使用硬件I2C读取甲醛传感器SGP30嵌入式_sgp30 不模拟i2c-程序员宅基地

文章浏览阅读203次。我们通过配置STM32CubeMX来初始化I2C外设,并编写代码来实现传感器的初始化和数据读取。在实际应用中,可以将读取到的甲醛浓度数据与预设的阈值进行比较,以便及时采取相应的措施来改善室内空气质量。因此,在许多应用中,监测室内空气中甲醛浓度的传感器变得越来越重要。通过以上步骤,我们可以使用硬件I2C在嵌入式系统中读取甲醛传感器SGP30的数据。打开Keil MDK,创建一个新的工程,并将生成的初始化代码添加到该工程中。最后,我们需要在main函数中调用这些函数,并添加必要的延时以进行周期性的数据读取。_sgp30 不模拟i2c

【iOS开发解决Tableview(CollectionView)上子视图和父试图手势冲突】_ios tableview 滑动手势冲突-程序员宅基地

文章浏览阅读605次。else { //如果不是,则恢复滑动。_ios tableview 滑动手势冲突

随便推点

PPT插件-布局参考-增加便携尺寸功能-程序员宅基地

文章浏览阅读899次,点赞20次,收藏8次。PPT大珩助手是一款全新设计的Office PPT插件,它是一款功能强大且实用的PPT辅助工具,支持Wps Word和Office Word,能够轻松帮助您修改、优化和管理幻灯片。凭借丰富的功能和用户友好的界面,PPT大珩助手能够助力您打造出精美而专业的演示文稿。我们致力于为用户提供卓越的使用体验,始终倾听用户的反馈和建议,不断改进和创新,以满足您的各种需求。相信通过使用PPT大珩助手,您能够高效而愉悦地完成幻灯片制作任务,并展示出令人印象深刻的演示效果。另外还有Word大珩助手。

重磅!2021QS世界大学学科排名发布:88所中国内地高校上榜!-程序员宅基地

文章浏览阅读657次。来源:QS官网、搜狐教育编辑:双一流高校今天(3月4日),全球高等教育研究机构QS世界大学排名编撰发行方QS (Quacquarelli Symonds)发布了2021QS世界大学学科排名..._世界传感器大学排名

Java中Array.sort()的几种用法_java中sort用法-程序员宅基地

文章浏览阅读313次。Java的Arrays类中有一个sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用。但是sort()的参数有好几种,下面我就为大家一一介绍,这几种形式的用法。======================================================1、Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序..._java中sort用法

Excel VBA ——批量工作表重命名-程序员宅基地

文章浏览阅读1.4k次。虽然平常在用excel 2010重命名工作表的时候,一般可能会用“双击工作表”的方法来重名,但是遇到大批量重名的时候就很麻烦。我的方法,先建一张新表,然后在第一列写好要命名的表名字,然后在VBE窗口里面输入代码Sub rename() '批量工作表重命名 Dim i As Integer For i = 1 To 5 Works..._vba批量修改sheet页并命名

下载的nginx证书转换成tomcat证书格式_nginx 证书 转换为pkcs12 证书-程序员宅基地

文章浏览阅读709次。XXX.crt private.key_nginx 证书 转换为pkcs12 证书

C#学习笔记11:winform上位机与西门子PLC网口通信_下篇-程序员宅基地

文章浏览阅读642次,点赞14次,收藏14次。主要知识点有:IP地址填写检查方法、读取写入方法、西门子PLC变量地址与类型的关系文章提供测试代码讲解、参数效果贴出、整体工程下载