MySQL中DATE_FORMATE函数使用时的注意点

 更新时间:2015年05月09日 10:23:05   投稿:goldensun  
这篇文章主要介绍了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 |
+----------------------------------------------------------------------------------------------+

就可以了 :)

相关文章

  • mysql下普通索引和唯一索引的效率对比

    mysql下普通索引和唯一索引的效率对比

    昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快
    2010-12-12
  • mysql中general_log日志知识点介绍

    mysql中general_log日志知识点介绍

    这篇文章主要介绍了mysql中general_log日志知识点的介绍以及其他相关内容,以后兴趣的朋友们学习下。
    2019-08-08
  • MySQL/MariaDB 如何实现数据透视表的示例代码

    MySQL/MariaDB 如何实现数据透视表的示例代码

    这篇文章主要介绍了MySQL/MariaDB 如何实现数据透视表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • mysql_ssl_rsa_setup的具体使用

    mysql_ssl_rsa_setup的具体使用

    mysql_ssl_rsa_setup 是一个MySQL附带的工具,用于自动创建SSL证书和密钥文件,本文主要介绍了mysql_ssl_rsa_setup的具体使用,感兴趣的可以了解一下
    2024-07-07
  • MySQL replace函数替换字符串语句的用法

    MySQL replace函数替换字符串语句的用法

    MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪。
    2010-12-12
  • MySQL数据库数据删除操作详解

    MySQL数据库数据删除操作详解

    本文我们将要学习的是作为删除数据使用的 “DELETE” 语句,“DELETE” 语句是用来删除数据的,它不能用来删除数据表本身。删除数据表使用的是 “DROP” 语句,而 “DELETE” 的作用只是用来删除记录而已
    2022-08-08
  • php连接MySQL的两种方式对比

    php连接MySQL的两种方式对比

    这篇文章主要介绍了php连接MySQL的两种方式对比,一种是原生的链接方式另外一种是PDO方式,附上示例,推荐给大家,有需要的小伙伴可以参考下
    2015-04-04
  • K8s中MySQL 数据持久化存储的实现

    K8s中MySQL 数据持久化存储的实现

    本文主要介绍了K8s中MySQL 数据持久化存储的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • MySQL操作并使用Python进行连接

    MySQL操作并使用Python进行连接

    这篇文章主要介绍了MySQL操作并使用Python进行连接,文章通过设置外键进行表与表的相连,且外键必须是其他表的主键展开详细内容,需要的小伙伴可以参考一下
    2022-06-06
  • Linux环境下安装MySQL8.0的完整步骤

    Linux环境下安装MySQL8.0的完整步骤

    数据库想必大家都很熟悉,但是要在服务器上自己来安装数据库,还是会出现不少的问题,下面这篇文章主要给大家介绍了关于在Linux环境下安装MySQL8.0的完整步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论