Bug #9442 Set parameter make query fail if column character set is UCS2
| Submitted: | 29 Mar 2005 5:56 | Modified: | 18 Jul 2005 19:59 |
|---|---|---|---|
| Reporter: | River Lee | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S2 (Serious) |
| Version: | 4.1 | OS: | Any (All) |
| Assigned to: | Konstantin Osipov | CPU Architecture: | Any |
[29 Mar 2005 5:59]
River Lee
Test case
Attachment: Test.java (application/octet-stream, text), 1.09 KiB.
[30 Mar 2005 16:32]
Mark Matthews
This is a server bug with prepared statements, see the following testcase:
I changed the category appropriately.
mysql> create table t1 ( etext varchar(20), gtext varchar(20) CHARACTER SET GBK, utext varchar(20) CHARACTER SET UCS2);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t1 values ("lily", "lily", "lily"); Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values ("river", "river", "river"); Query OK, 1 row affected (0.00 sec)
mysql> prepare foo from 'select utext from t1 where utext like ?'; Query OK, 0 rows affected (0.02 sec)
Statement prepared
mysql> set @param1='%%';
Query OK, 0 rows affected (0.00 sec)
mysql> execute foo using @param1;
Empty set (0.02 sec)
mysql> select utext from t1 where utext like '%%'; +-------+
| utext |
+-------+
| lily |
| river |
+-------+
2 rows in set (0.00 sec)
[24 Apr 2005 22:17]
Jorge del Conde
Verified w/4.1.12 from bk
[6 May 2005 11:31]
Alexander Barkov
A simplified version reproducing the problem looks like: # # Bug#9442 Set parameter make query fail if column character set is UCS2 # create table t1 (utext varchar(20) character set ucs2); insert into t1 values ("lily"); insert into t1 values ("river"); prepare foo from 'select utext from t1 where utext like ?'; set @param1='%%'; execute foo using @param1; drop table t1;
[13 Jul 2005 20:19]
Konstantin Osipov
Added a test case to the test suite, the bug can not be repeated after the fix for Bug#9379. (http://lists.mysql.com/internals/27029)
[14 Jul 2005 7:51]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/27051
[15 Jul 2005 15:50]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/27179
[18 Jul 2005 19:59]
Paul DuBois
Noted in 4.1.14, 5.0.10 changelogs.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.060 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.
Description: Query fails for PreparedStatement to set parameters if column character set is UCS2, when connectj is 3.1.7 or 3.2.0-alpha, but get correct results when 3.0.16. However, it won't get this problem if put the parameters directly in sql statement Enviroment: mysql 4.1.10a-nt with default-character-set (ISO 8859-1) Both database and table are created with default-character-set How to repeat: 1. create table t1 ( etext varchar(20), gtext varchar(20) CHARACTER SET GBK, utext varchar(20) CHARACTER SET UCS2); insert into t1 values ("river", "river", "river"); insert into t1 values ("lily", "lily", "lily"); commit; 2. Modify corresponding DB parameters and run Test.java: import java.sql.*; public class Test { private static String DB_URL = "jdbc:mysql://localhost:3306/quickstart"; private static String DB_USER = "root"; private static String DB_PWD = "password"; public static void run (String col, boolean direct) { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection con = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD); String statement = "select " + col + " from t1 where " + col + " like " + (direct ? "'%%'" : "?"); PreparedStatement prep = con.prepareStatement(statement); if (!direct) prep.setString(1, "%%"); ResultSet rs = prep.executeQuery(); int count = 0; while (rs.next()) { System.out.println(rs.getString(1)); count++; } prep.close(); con.close(); System.out.println("Find " + count + " items totally by " + col + (direct ? " " : " un") + "directly\n"); } catch (Exception e) { System.out.println(e); } } public static void main (String[] args) { run ("etext", false); run ("gtext", false); run ("utext", false); run ("utext", true); } } 3. Get the results: ---------- Java ---------- river lily Find 2 items totally by etext undirectly river lily Find 2 items totally by gtext undirectly Find 0 items totally by utext undirectly -> 2 items expected river lily Find 2 items totally by utext directly Suggested fix: refer to connectj 3.0.16