MySQL DATE_FORMATE函数内置字符集的坑

今天帮同事处理一个SQL(简化过后的)执行报错:

mysql> select date_format(‘2013-11-19‘,‘Y-m-d‘) > timediff(‘2013-11-19‘, ‘2013-11-20‘);                                         

ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation ‘>‘

乍一看挺莫名其妙的,查了下手册,发现有这么一段:

The language used for day and month names and abbreviations is controlled by the value of the lc_time_names system variable (Section 9.7, “MySQL Server Locale Support”).

The DATE_FORMAT() returns a string with a character set and collation given by character_set_connection and collation_connection so that it can return month and weekday names containing non-ASCII characters.

也就是说,DATE_FORMATE() 函数返回的结果是带有字符集/校验集属性的,而 TIMEDIFF() 函数则没有字符集/校验集属性,我们来验证一下:

mysql> set names utf8;mysql> select charset(date_format(‘2013-11-19‘,‘Y-m-d‘)), charset(timediff(‘2013-11-19‘, ‘2013-11-20‘));+--------------------------------------------+-----------------------------------------------+| charset(date_format(‘2013-11-19‘,‘Y-m-d‘)) | charset(timediff(‘2013-11-19‘, ‘2013-11-20‘)) |+--------------------------------------------+-----------------------------------------------+| utf8                                       | binary                                        |+--------------------------------------------+-----------------------------------------------+

mysql> set names gb2312;mysql> select charset(date_format(‘2013-11-19‘,‘Y-m-d‘)), charset(timediff(‘2013-11-19‘, ‘2013-11-20‘));+--------------------------------------------+-----------------------------------------------+| charset(date_format(‘2013-11-19‘,‘Y-m-d‘)) | charset(timediff(‘2013-11-19‘, ‘2013-11-20‘)) |+--------------------------------------------+-----------------------------------------------+| gb2312                                     | binary                                        |+--------------------------------------------+-----------------------------------------------+

可以看到,随着通过 SET NAMES 修改 character_set_connection、collation_connection  值,DATE_FORMAT() 函数返回结果的字符集也跟着不一样。在这种情况下,想要正常工作,就需要将结果进行一次字符集转换,例如:

mysql> select date_format(‘2013-11-19‘,‘Y-m-d‘) > convert(timediff(‘2013-11-19‘, ‘2013-11-20‘) using utf8);+----------------------------------------------------------------------------------------------+| date_format(‘2013-11-19‘,‘Y-m-d‘) > convert(timediff(‘2013-11-19‘, ‘2013-11-20‘) using utf8) |+----------------------------------------------------------------------------------------------+|                                                                                            1 |+----------------------------------------------------------------------------------------------+

就可以了 :)

P.S,MySQL的版本:5.5.20-55-log Percona Server (GPL), Release rel24.1, Revision 217

--------------------------------------分割线--------------------------------------

知数堂 (http://zhishuedu.com)培训是由资深MySQL专家叶金荣、吴炳锡联合推出的专业优质培训品牌,主要有MySQL DBA实战优化和Python运维开发课程,是业内最有良心、最有品质的培训课程。

本文出自 “老叶茶馆” 博客,请务必保留此出处http://imysql.blog.51cto.com/1540006/1879883

时间: 2024-10-11 01:48:43

MySQL DATE_FORMATE函数内置字符集的坑的相关文章

MySQL中的内置系统函数

MySQL中的内置系统函数 用在SELECCT语句, 能及子句 where order by having 中 UPDATE DELETE, 函数中可以将字段名作为变量来用,变量的值就是这个列对应的每一行记录 一.字符串函数 php中用的函数,MySQl中大部也提供 1. CONCAT(S1,S2....SN): 把传入的参数连接成一个字符串 2. INSERT(str, x, y, insert): 将字符串X位置开始,y个字符串长度替换为字符串insert 3. LOWER(str) UPP

mysql全文索引____内置分词变量

上一节,我们发现搜索'a',但是发现'aa','aaa','aaaa'搜索不出来.为什么呢? 这就涉及到mysql的一个内置变量ft_boolean_syntax. ft_boolean_syntax Variable_name    Value ft_boolean_syntax    + -><()~*:""&|(其中有一个空格) 该变量的意思,表示需要被全文索引的字段通过以上这些变量进行分词切分. 譬如有一段字符串"a,b,c,ab",如果

MYSQL 常见的内置函数与自定义函数

MySQL 内置函数: 字符函数 数值函数 时间日期函数 常见的数值函数的使用: 1 select avg(tdb_goods) from tdb_goods; //求字段值的平均数 内置的求和函数: 1 select sum(goods_price) from tdb_goods; //求字段值的和 常见的日期函数举例 1 select now(); 1 select current_timestamp(); 用户自定义函数: 语法 20.2.1. CREATE PROCEDURE和CREAT

Mysql函数(内置函数,自定义函数)

简述 SQL:结构化查询语言,是一门编程语言,是用于管理数据库的编程语言. 元素:数据,数据类型,变量,函数,流程控制,运算符,注释. 注释: 行: # –[空格] 块: /* */ select * from swpu_stu #where id=2; ; select * from swpu_stu -- where id=2; ; 结束符: select * from swpu_stu where id=2\g select * from swpu_stu where id=2\G 可以使

Python学习(五)函数 —— 内置函数 lambda filter map reduce

Python 内置函数 lambda.filter.map.reduce Python 内置了一些比较特殊且实用的函数,使用这些能使你的代码简洁而易读. 下面对 Python 的 lambda.filter.map.reduce 进行初步的学习. lambda 匿名函数 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值. lambda语句构建的其实是一个函数对象,参考下例来感受下 lambda 匿名函数: 1 def f(i): # 用户自定义返回平方数 2 retur

函数-内置函数,匿名函数,嵌套函数,高阶函数,序列化

函数简单说明 # 函数即"变量" # 高阶函数 # a.把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码的情况下,为其添加功能) # b.返回值中包含函数名(不修改函数的调用方式) ''' import time def bar(): print("in the bar!") time.sleep(2) def foo(func): start_time = time.time() func() #根据内存地址,执行代码 stop_time = tim

pythopn 函数(内置函数)

内置函数(Py3.5) 重要的内置函数: 1. filter(function, sequence) # 描述: filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判, 然后返回 True 或 False,最后将返回 True 的元素放到新列表中. # 语法: 以下是 filter() 方法的语法: filter(function,sequence) # 参数: funct

4/2 三元表达式/函数递归/匿名函数/内置函数

三元表达式 def max2(x,y) if x > y: return x else return y res=max2(10,11) 三元表达式仅应用于: 1 条件成立返回一个值 2 条件不成功返回一个值 def max2(x,y): return x if x>y else y print (max2(2,10)) 10 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数的本身. 直接调用 def foo(): print ('fffff') foo() 间接调用

函数递归+匿名函数+内置函数day15

一.函数递归 什么是函数递归: 函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身. 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Python中限定递归最多调用1000层. 1000层这个值是大概的数值,这个数值可以通过Python内置的功能进行更改. 递归必须要有两个明确的阶段: 递推:一层层递归调用下去,强调每次进入下一次递归,问题规模都在减小 回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,开始一层层回溯 其中,