您当前的位置: 首页 > 数据库教程 > MySQL教程 > MySQL中DATE_FORMATE函数内置字符集

MySQL中DATE_FORMATE函数内置字符集

作者:不详 来源:网络 发布时间: 2014-07-17 11:28 点击:
今天帮同事处理一个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 o

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

  附后

  下面是函数的参数说明:

  %S, %s 两位数字形式的秒( 00,01, . . ., 59)

  %i 两位数字形式的分( 00,01, . . ., 59)

  %H 两位数字形式的小时,24 小时(00,01, . . ., 23)

  %h, %I 两位数字形式的小时,12 小时(01,02, . . ., 12)

  %k 数字形式的小时,24 小时(0,1, . . ., 23)

  %l 数字形式的小时,12 小时(1, 2, . . ., 12)

  %T 24 小时的时间形式(hh : mm : s s)

  %r 12 小时的时间形式(hh:mm:ss AM 或hh:mm:ss PM)

  %p AM 或P M

  %W 一周中每一天的名称( Sunday, Monday, . . ., Saturday)

  %a 一周中每一天名称的缩写( Sun, Mon, . . ., Sat)

  %d 两位数字表示月中的天数( 00, 01, . . ., 31)

  %e 数字形式表示月中的天数( 1, 2, . . ., 31)

  %D 英文后缀表示月中的天数( 1st, 2nd, 3rd, . . .)

  %w 以数字形式表示周中的天数( 0 = Sunday, 1=Monday, . . ., 6=Saturday)

  %j 以三位数字表示年中的天数( 001, 002, . . ., 366)

  % U 周(0, 1, 52),其中Sunday 为周中的第一天

  %u 周(0, 1, 52),其中Monday 为周中的第一天

  %M 月名(January, February, . . ., December)

  %b 缩写的月名( January, February, . . ., December)

  %m 两位数字表示的月份( 01, 02, . . ., 12)

  %c 数字表示的月份( 1, 2, . . ., 12)

  %Y 四位数字表示的年份

  %y 两位数字表示的年份

  %% 直接值“%”
分享到:
本文"MySQL中DATE_FORMATE函数内置字符集"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4