Bug #74449 | Incorrect datetime casting with charcter_set_connection=sjis | ||
---|---|---|---|
Submitted: | 20 Oct 2014 9:39 | Modified: | 20 Oct 2014 10:44 |
Reporter: | Tsubasa Tanaka (OCA) | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Charsets | Severity: | S3 (Non-critical) |
Version: | 5.5.40, 5.6.21, 5.7.5, 5.6.22 | OS: | Linux (CentOS 6.3) |
Assigned to: | CPU Architecture: | Any | |
Tags: | cast, datetime, INDEX |
[20 Oct 2014 9:39]
Tsubasa Tanaka
[20 Oct 2014 10:21]
MySQL Verification Team
Hello tsubasa, Thank you for the report and test case. Thanks, Umesh
[20 Oct 2014 10:22]
MySQL Verification Team
// 5.6.22 mysql> CREATE TABLE t1 (dt datetime not null, key(dt)); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO t1 VALUES ('2010-01-01'), ('2011-01-01'), ('2012-01-01'), ('2013-01-01'), ('2014-01-01'); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> SHOW SESSION VARIABLES LIKE 'character%'; +--------------------------+-------------------------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /data/ushastry/server/mysql-advanced-5.6.22/share/charsets/ | +--------------------------+-------------------------------------------------------------+ 8 rows in set (0.00 sec) mysql> explain SELECT * FROM t1 WHERE dt < '2012-12-31'; +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | 1 | SIMPLE | t1 | range | dt | dt | 5 | NULL | 3 | Using where; Using index | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ 1 row in set (0.00 sec) mysql> SET SESSION character_set_connection= sjis; Query OK, 0 rows affected (0.00 sec) mysql> explain SELECT * FROM t1 WHERE dt < '2012-12-31'; +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | 1 | SIMPLE | t1 | index | NULL | dt | 5 | NULL | 5 | Using where; Using index | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ 1 row in set (0.00 sec)
[20 Oct 2014 10:39]
Tsubasa Tanaka
Hello Umesh, Thank you for verifying. This bug brings our environment serious performance issue :( Just information for people facing same problem, workaround is using CAST function to avoid implicit cast. mysql56> SELECT @@character_set_connection; +----------------------------+ | @@character_set_connection | +----------------------------+ | sjis | +----------------------------+ 1 row in set (0.00 sec) mysql56> explain SELECT * FROM t1 WHERE dt < '2012-12-31'; +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | 1 | SIMPLE | t1 | index | NULL | dt | 5 | NULL | 5 | Using where; Using index | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ 1 row in set (0.00 sec) mysql56> explain SELECT * FROM t1 WHERE dt < CAST('2012-12-31' AS datetime); +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ | 1 | SIMPLE | t1 | range | dt | dt | 5 | NULL | 3 | Using where; Using index | +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+ 1 row in set (0.01 sec)
[20 Oct 2014 10:44]
Tsubasa Tanaka
And I found this maybe duplicate of that one. #62307: Condition "TIME = '19:20'" does not use index in sjis http://bugs.mysql.com/bug.php?id=62307