Bug #5203 mysql returns unterminated unicode strings
Submitted: 25 Aug 2004 11:44 Modified: 30 Nov 2004 16:24
Reporter: [ name withheld ] Email Updates:
Status: No Feedback Impact on me:
None 
Category:MySQL Server: InnoDB storage engine Severity:S3 (Non-critical)
Version:4.1.3b OS:Windows (Windows XP)
Assigned to: Assigned Account CPU Architecture:Any

[25 Aug 2004 11:44] [ name withheld ]
Description:
If I try to order a query like the one below by an unicode varchar field, it seems that the returned strings are notterminated. If I order the same query by a non unicode field it works correctly. This effect occurs, if I do a join and sort over a unicode column where multiple records, of a single record in the original table, have to be displayed do perform the join. If i do such order queries not using joins, everything goes correct.

mysql> SELECT MyName, TransTime FROM tblMy, tbllog WHERE tbllog.MyId = tblMy.MyId ORDER BY 1
DESC limit 0,10;
+-----------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
-------------+---------------------+
| MyName

             | TransTime           |
+-----------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
-------------+---------------------+
| MyData 3TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 10:33:02 |
| MyData 3TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:02:59 |
| MyData 3TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-24 18:23:09 |
| MyData 2TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:09:36 |
| MyData 2TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:10:08 |
| MyData 2TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:10:29 |
| MyData 1TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 10:33:02 |
| MyData 1TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:02:59 |
| MyData 1TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:10:08 |
| MyData 1TB
    ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††
†††††††††††† | 2004-08-23 17:10:29 |
+-----------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
-------------+---------------------+
10 rows in set (0.00 sec)

mysql> SELECT MyName, TransTime FROM tblMy, tbllog WHERE tbllog.MyId = tblMy.MyId ORDER BY 2
DESC limit 0,10;
+-----------------+---------------------+
| MyName          | TransTime           |
+-----------------+---------------------+
| Audio           | 2004-08-25 09:33:56 |
| Audio           | 2004-08-25 09:31:05 |
| Audio           | 2004-08-25 09:30:55 |
| Audio           | 2004-08-25 09:30:49 |
| MyData 3TB      | 2004-08-24 18:23:09 |
| MyData2         | 2004-08-24 12:31:21 |
| Realtime        | 2004-08-23 17:48:35 |
| MyData 1TB      | 2004-08-23 17:10:29 |
| Realtime        | 2004-08-23 17:10:29 |
| MyData2         | 2004-08-23 17:10:29 |
+-----------------+---------------------+
10 rows in set (0.00 sec)

// field definition

CREATE TABLE tblMy (
        ...
        MyName VARCHAR (250) UNICODE NOT NULL,
	...
PRIMARY KEY (MyID)
) TYPE=InnoDB;

for example if I add to the query "LENGTH(MyName)" it works sometimes, or returns the value 500 for the column "LENGTH(MyName)"

How to repeat:
see description

Suggested fix:
strings have to be terminated correctly
[25 Aug 2004 23:15] Hartmut Holzgraefe
I have not been able to reproduce this behaviour yet.

Can you please upload table dumps or at least
add EXPLAIN output for the example queries?
[26 Aug 2004 10:26] [ name withheld ]
I change the VARCHAR length to 120 and everything works now. Because VARCHAR is limited to 255 characters, normally 1 Byte for each character. So this results to a maximum of 255 Bytes. Unicode uses 2 Byte per character, so may there be the limit at 128 characters in unicode???
[2 Sep 2004 15:42] [ name withheld ]
Run this SQL Script to reproduce the error

-- Create tables
CREATE TABLE tblType (
        TypeID        INT NOT NULL AUTO_INCREMENT UNIQUE,
        TypeName      VARCHAR (250) UNICODE NOT NULL,
        TypeDesc      VARCHAR (250) UNICODE NOT NULL,
        TypeStatus    TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (TypeID)
) TYPE=InnoDB;

CREATE TABLE tblTestTypeLnk (
        TestID        INT NOT NULL,
        TypeID        INT NOT NULL,
        TestCount     INT NOT NULL
) TYPE=InnoDB;

CREATE TABLE tblTest (
        TestID           INT NOT NULL AUTO_INCREMENT UNIQUE,
        TestName         VARCHAR (250) UNICODE NOT NULL,
        TestDesc         VARCHAR (250) UNICODE NOT NULL,
PRIMARY KEY (TestID)
) TYPE=InnoDB;

CREATE TABLE tblPerson (
		PersonID	INT NOT NULL AUTO_INCREMENT UNIQUE,
		PersonName	VARCHAR (250) UNICODE NOT NULL,
PRIMARY KEY (PersonID)
) TYPE=InnoDB;

CREATE TABLE tblPersonTestLnk (
		PersonID	INT NOT NULL,
		TestID		INT NOT NULL
) TYPE=InnoDB;

-- add foreign keys
ALTER TABLE tblTestTypeLnk ADD CONSTRAINT FK_tblTTL_tblType FOREIGN KEY (TypeID) REFERENCES tblType(TypeID);
ALTER TABLE tblTestTypeLnk ADD CONSTRAINT FK_tblTTL_tblTest FOREIGN KEY (TestID) REFERENCES tblTest(TestID);
ALTER TABLE tblPersonTestLnk ADD CONSTRAINT FK_tblPTL_tblPerson FOREIGN KEY (PersonID) REFERENCES tblPerson(PersonID);
ALTER TABLE tblPersonTestLnk ADD CONSTRAINT FK_tblPTL_tblTest FOREIGN KEY (TestID) REFERENCES tblTest(TestID);

-- insert some test data
INSERT INTO tblType ( TypeID, TypeName, TypeDesc, TypeStatus ) VALUES ( 1, 'Dong', 'Dong desc', 1 );
INSERT INTO tblType ( TypeID, TypeName, TypeDesc, TypeStatus ) VALUES ( 2, 'Bla', 'Bla desc', 1 );

INSERT INTO tblTest ( TestID, TestName, TestDesc ) VALUES ( 1, 'Test1', 'testdesc1' );
INSERT INTO tblTest ( TestID, TestName, TestDesc ) VALUES ( 2, 'Test2', 'testdesc2' );
INSERT INTO tblTest ( TestID, TestName, TestDesc ) VALUES ( 3, 'Test3', 'testdesc3' );
INSERT INTO tblTest ( TestID, TestName, TestDesc ) VALUES ( 4, 'Test4', 'testdesc4' );
INSERT INTO tblTest ( TestID, TestName, TestDesc ) VALUES ( 5, 'Test5', 'testdesc5' );
INSERT INTO tblTest ( TestID, TestName, TestDesc ) VALUES ( 6, 'Test6', 'testdesc6' );

INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 1, 1 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 2, 1 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 3, 1 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 4, 1 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 5, 1 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 6, 1 );

INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 1, 2 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 2, 2 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 3, 2 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 4, 2 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 5, 2 );
INSERT INTO tblTestTypeLnk ( TestID, TypeID ) VALUES ( 6, 2 );

INSERT INTO tblPerson ( PersonID, PersonName ) VALUES ( 1, 'Paul');

INSERT INTO tblPersonTestLnk ( PersonID, TestID ) VALUES ( 1, 1 );
INSERT INTO tblPersonTestLnk ( PersonID, TestID ) VALUES ( 1, 2 );
INSERT INTO tblPersonTestLnk ( PersonID, TestID ) VALUES ( 1, 3 );
INSERT INTO tblPersonTestLnk ( PersonID, TestID ) VALUES ( 1, 4 );
INSERT INTO tblPersonTestLnk ( PersonID, TestID ) VALUES ( 1, 5 );
INSERT INTO tblPersonTestLnk ( PersonID, TestID ) VALUES ( 1, 6 );

-- lauch this query to get the error
SELECT typename, typedesc, testname, testdesc FROM tbltest, tbltype, tbltesttypelnk, tblpersontestlnk WHERE tbltest.TestID = tbltesttypelnk.TestID AND tbltype.TypeID = tbltesttypelnk.TypeID AND tbltest.Testid = tblpersontestlnk.PersonID = tblpersontestlnk.PersonID = 1 ORDER BY typename DESC
[11 Sep 2004 3:34] MySQL Verification Team
I tested your script against the 4.1.4 and I got an empty set:

mysql> SELECT typename, typedesc, testname, testdesc FROM tbltest, tbltype,
    -> tbltesttypelnk, tblpersontestlnk WHERE tbltest.TestID = tbltesttypelnk.TestID
    -> AND tbltype.TypeID = tbltesttypelnk.TypeID AND tbltest.Testid =
    -> tblpersontestlnk.PersonID = tblpersontestlnk.PersonID = 1 ORDER BY typename DESC;
Empty set (0.01 sec)
[13 Sep 2004 7:07] [ name withheld ]
Sorry there was an error in the query? I corrected the query:
SELECT typename, typedesc, testname, testdesc FROM tbltest, tbltype, tbltesttypelnk, tblpersontestlnk WHERE tbltest.TestID = tbltesttypelnk.TestID AND tbltype.TypeID = tbltesttypelnk.TypeID AND tbltest.Testid = tblpersontestlnk.PersonID AND tblpersontestlnk.PersonID = 1 ORDER BY typename DESC
[30 Oct 2004 16:24] Heikki Tuuri
Hi!

Please test again with 4.1.7. Look from http://www.innodb.com if you need to rebuild your table.

Regards,

Heikki
[14 Feb 2005 22:54] Bugs System
No feedback was provided for this bug for over a month, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".