MySQL 5.6.35版本STR_TO_DATE对于中文日期转换的BUG
MySQL 5.6.35版本STR_TO_DATE对于中文日期转换的BUG
mysql> select @@character_set_server; +------------------------+ | @@character_set_server | +------------------------+ | gbk | +------------------------+ 1 row in set (0.00 sec) mysql> select version(),@@version; +------------+------------+ | version() | @@version | +------------+------------+ | 5.6.35-log | 5.6.35-log | +------------+------------+ 1 row in set (0.00 sec)
构造测试环境,会看到使用str_to_date后值为NULL。
mysql> create table zkm ( date varchar(100)); Query OK, 0 rows affected (0.00 sec) mysql> insert into zkm values ('2022年11月14日'); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> SELECT STR_TO_DATE(date,'%Y年%m月%d日') FROM zkm; +-------------------------------------+ | STR_TO_DATE(date,'%Y年%m月%d日') | +-------------------------------------+ | NULL | +-------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> show warnings; +---------+------+-----------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------+ | Warning | 1411 | Incorrect datetime value: '2022' for function str_to_date | +---------+------+-----------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select STR_TO_DATE(date,'%Y') FROM zkm; +------------------------+ | STR_TO_DATE(date,'%Y') | +------------------------+ | 2022-00-00 | +------------------------+ 1 row in set, 1 warning (0.00 sec)
从warnings提示可以知道,“年”包括“年”之后的信息全部丢失。
因此使用STR_TO_DATE(date,'%Y')会发现可以正常显示,只不过“月”“日”信息丢失了。
对于使用字段转换有问题,但是对于直接指定的字符串就没有问题。
mysql> SELECT STR_TO_DATE('2022年11月14日','%Y年%m月%d日'); +----------------------------------------------------+ | STR_TO_DATE('2022年11月14日','%Y年%m月%d日') | +----------------------------------------------------+ | 2022-11-14 | +----------------------------------------------------+ 1 row in set (0.00 sec)
另外,在版本8.0.30中就没有这个bug。
(root@localhost 11:23:41) [ccs]> create table zkm ( date varchar(100)); Query OK, 0 rows affected (0.19 sec) (root@localhost 11:23:44) [ccs]> insert into zkm values ('2022年11月14日'); Query OK, 1 row affected (0.00 sec) (root@localhost 11:23:46) [ccs]> commit; Query OK, 0 rows affected (0.00 sec) (root@localhost 11:23:49) [ccs]> SELECT STR_TO_DATE(date,'%Y年%m月%d日') FROM zkm; +-------------------------------------+ | STR_TO_DATE(date,'%Y年%m月%d日') | +-------------------------------------+ | 2022-11-14 | +-------------------------------------+ 1 row in set (0.00 sec)
正常。