Bug #62307 | Condition "TIME = '19:20'" does not use index in sjis | ||
---|---|---|---|
Submitted: | 31 Aug 2011 1:54 | Modified: | 1 Sep 2011 0:40 |
Reporter: | Sadao Hiratsuka (Basic Quality Contributor) | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
Version: | 5.5.15 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | qc, sjis |
[31 Aug 2011 1:54]
Sadao Hiratsuka
[31 Aug 2011 1:56]
Sadao Hiratsuka
> From MySQL 5.5, cp932 has MY_CS_NONASCII flag in CHARSET_INFO structure. From MySQL 5.5, sjis has MY_CS_NONASCII flag in CHARSET_INFO structure. Sorry.
[31 Aug 2011 2:07]
MySQL Verification Team
C:\DBS>c:\dbs\5.5\bin\mysql -uroot --port=3540 --prompt="mysql 5.5 >" Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.5.17-log 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 5.5 >use test Database changed mysql 5.5 >DROP TABLE IF EXISTS timetest; Query OK, 0 rows affected, 1 warning (0.06 sec) mysql 5.5 > mysql 5.5 >CREATE TABLE timetest ( -> id INT PRIMARY KEY, -> tm TIME, -> tx VARCHAR(100), -> KEY timetest_idx1 (tm) -> ) ENGINE = InnoDB CHARACTER SET = utf8; Query OK, 0 rows affected (0.23 sec) mysql 5.5 > mysql 5.5 >INSERT INTO timetest VALUES (1, '18:10', 'aaaaa'); Query OK, 1 row affected (0.12 sec) mysql 5.5 >INSERT INTO timetest VALUES (2, '19:20', 'bbbbb'); Query OK, 1 row affected (0.08 sec) mysql 5.5 >INSERT INTO timetest VALUES (3, '20:30', 'ccccc'); Query OK, 1 row affected (0.14 sec) mysql 5.5 >INSERT INTO timetest VALUES (4, '21:40', 'ddddd'); Query OK, 1 row affected (0.15 sec) mysql 5.5 >INSERT INTO timetest VALUES (5, '22:50', 'eeeee'); Query OK, 1 row affected (0.11 sec) mysql 5.5 > mysql 5.5 >SET LOCAL character_set_connection = utf8; Query OK, 0 rows affected (0.00 sec) mysql 5.5 >EXPLAIN EXTENDED SELECT tx FROM timetest WHERE tm = '19:20'; +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | timetest | ref | timetest_idx1 | timetest_idx1 | 4 | const | 1 | 100.00 | Using where | +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.06 sec) mysql 5.5 >SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: select `test`.`timetest`.`tx` AS `tx` from `test`.`timetest` where (`test`.`timetest`.`tm` = 192000) 1 row in set (0.00 sec) mysql 5.5 > mysql 5.5 >SET LOCAL character_set_connection = sjis; Query OK, 0 rows affected (0.00 sec) mysql 5.5 >EXPLAIN EXTENDED SELECT tx FROM timetest WHERE tm = '19:20'; +----+-------------+----------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | timetest | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | Using where | +----+-------------+----------+------+---------------+------+---------+------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) mysql 5.5 >SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: select `test`.`timetest`.`tx` AS `tx` from `test`.`timetest` where (convert(`test`.`timetest`.`tm` using sjis) = '19:20') 1 row in set (0.00 sec) mysql 5.5 >exit Bye C:\DBS>51 C:\DBS>c:\dbs\5.1\bin\mysql -uroot --port=3510 --prompt="mysql 5.1 >" Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.59-Win X64-log 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 5.1 >use test Database changed mysql 5.1 >DROP TABLE IF EXISTS timetest; Query OK, 0 rows affected, 1 warning (0.05 sec) mysql 5.1 > mysql 5.1 >CREATE TABLE timetest ( -> id INT PRIMARY KEY, -> tm TIME, -> tx VARCHAR(100), -> KEY timetest_idx1 (tm) -> ) ENGINE = InnoDB CHARACTER SET = utf8; Query OK, 0 rows affected (0.17 sec) mysql 5.1 > mysql 5.1 >INSERT INTO timetest VALUES (1, '18:10', 'aaaaa'); Query OK, 1 row affected (0.11 sec) mysql 5.1 >INSERT INTO timetest VALUES (2, '19:20', 'bbbbb'); Query OK, 1 row affected (0.07 sec) mysql 5.1 >INSERT INTO timetest VALUES (3, '20:30', 'ccccc'); Query OK, 1 row affected (0.07 sec) mysql 5.1 >INSERT INTO timetest VALUES (4, '21:40', 'ddddd'); Query OK, 1 row affected (0.07 sec) mysql 5.1 >INSERT INTO timetest VALUES (5, '22:50', 'eeeee'); Query OK, 1 row affected (0.07 sec) mysql 5.1 > mysql 5.1 >SET LOCAL character_set_connection = utf8; Query OK, 0 rows affected (0.00 sec) mysql 5.1 >EXPLAIN EXTENDED SELECT tx FROM timetest WHERE tm = '19:20'; +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | timetest | ref | timetest_idx1 | timetest_idx1 | 4 | const | 1 | 100.00 | Using where | +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.02 sec) mysql 5.1 >SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: select `test`.`timetest`.`tx` AS `tx` from `test`.`timetest` where (`test`.`timetest`.`tm` = 192000) 1 row in set (0.00 sec) mysql 5.1 > mysql 5.1 >SET LOCAL character_set_connection = sjis; Query OK, 0 rows affected (0.00 sec) mysql 5.1 >EXPLAIN EXTENDED SELECT tx FROM timetest WHERE tm = '19:20'; +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | timetest | ref | timetest_idx1 | timetest_idx1 | 4 | const | 1 | 100.00 | Using where | +----+-------------+----------+------+---------------+---------------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) mysql 5.1 >SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: select `test`.`timetest`.`tx` AS `tx` from `test`.`timetest` where (`test`.`timetest`.`tm` = 192000) 1 row in set (0.00 sec) mysql 5.1 >
[31 Aug 2011 9:58]
MySQL Verification Team
Thank you for the bug report.
[1 Sep 2011 0:40]
Sadao Hiratsuka
Thank you for your verification. Additionally, This bug may cause invalid query results for some TIME format. mysql> SET LOCAL character_set_connection = utf8; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM timetest WHERE tm = '020:30'; +----+----------+-------+ | id | tm | tx | +----+----------+-------+ | 3 | 20:30:00 | ccccc | +----+----------+-------+ 1 row in set (0.00 sec) mysql> SET LOCAL character_set_connection = sjis; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM timetest WHERE tm = '020:30'; Empty set (0.00 sec)