Bug #64023 STR_TO_DATE / DATE_FORMAT combination gives wrong values for non 'en_*' charsets

Submitted: 13 Jan 2012 12:57 Modified: 13 Jan 2012 15:02
Reporter: Daniel Walter Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Charsets Severity:S3 (Non-critical)
Version:5.1.61, 5.5.16-log OS:Any
Assigned to: CPU Architecture:Any
Tags: charset, date_format, STR_TO_DATE

[13 Jan 2012 12:57] Daniel Walter
Description:
Expected behaviour:

mysql> SELECT @@lc_time_names;
+-----------------+
| @@lc_time_names |
+-----------------+
| en_US           |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT DATE_FORMAT('2009-10-02','%e. %M %Y'), STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y');
+---------------------------------------+--------------------------------------------------------------------+
| DATE_FORMAT('2009-10-02','%e. %M %Y') | STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y') |
+---------------------------------------+--------------------------------------------------------------------+
| 2. October 2009                       | 2009-10-02                                                         |
+---------------------------------------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW WARNINGS;
Empty set (0.00 sec)

Buggy behaviour:

mysql> SET lc_time_names = 'de_DE';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT DATE_FORMAT('2009-10-02','%e. %M %Y'), STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y');
+---------------------------------------+--------------------------------------------------------------------+
| DATE_FORMAT('2009-10-02','%e. %M %Y') | STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y') |
+---------------------------------------+--------------------------------------------------------------------+
| 2. Oktober 2009                       | NULL                                                               |
+---------------------------------------+--------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------------------------------------+
| Level   | Code | Message                                                              |
+---------+------+----------------------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '2. Oktober 2009' for function str_to_date |
+---------+------+----------------------------------------------------------------------+
1 row in set (0.00 sec)

How to repeat:
SET lc_time_names = 'de_DE';
SELECT DATE_FORMAT('2009-10-02','%e. %M %Y'), STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y');
SHOW WARNINGS;
[13 Jan 2012 15:02] Valeriy Kravchuk
Thank you for the problem report. Verified with 5.1.61 on Mac OS X also:

macbook-pro:5.1 openxs$ bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.1.61-debug Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT @@lc_time_names;
+-----------------+
| @@lc_time_names |
+-----------------+
| en_US           |
+-----------------+
1 row in set (0.02 sec)

mysql> SELECT DATE_FORMAT('2009-10-02','%e. %M %Y'), STR_TO_DATE(
    -> DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y');
+---------------------------------------+--------------------------------------------------------------------+
| DATE_FORMAT('2009-10-02','%e. %M %Y') | STR_TO_DATE(
DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y') |
+---------------------------------------+--------------------------------------------------------------------+
| 2. October 2009                       | 2009-10-02                                                         |
+---------------------------------------+--------------------------------------------------------------------+
1 row in set (0.08 sec)

mysql> SET lc_time_names = 'de_DE';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT DATE_FORMAT('2009-10-02','%e. %M %Y'), STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y');
+---------------------------------------+--------------------------------------------------------------------+
| DATE_FORMAT('2009-10-02','%e. %M %Y') | STR_TO_DATE( DATE_FORMAT('2009-10-02', '%e. %M %Y'),  '%e. %M %Y') |
+---------------------------------------+--------------------------------------------------------------------+
| 2. Oktober 2009                       | NULL                                                               |
+---------------------------------------+--------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

mysql> show warnings\G
*************************** 1. row ***************************
  Level: Error
   Code: 1411
Message: Incorrect datetime value: '2. Oktober 2009' for function str_to_date
1 row in set (0.07 sec)

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.039 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.