Bug #47985 | UTF-8 String Length Issue (guids etc) | ||
---|---|---|---|
Submitted: | 12 Oct 2009 7:11 | Modified: | 5 Nov 2009 16:18 |
Reporter: | Christos Pavlides | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | Connector / NET | Severity: | S3 (Non-critical) |
Version: | OS: | Any | |
Assigned to: | Reggie Burnett | CPU Architecture: | Any |
Tags: | UTF-8 Guid Length |
[12 Oct 2009 7:11]
Christos Pavlides
[12 Oct 2009 9:23]
Tonci Grgin
Hi Christos and thanks for your report. Can you please attach a small, self-sufficient test case so I can check? I'm particularly interested in connection string used.
[12 Oct 2009 10:34]
Christos Pavlides
I don't have a test case, since I was in a hurry to make the necessary changes and deploy a new server... but the connection string is: "server=127.0.0.1;user id=user;persist security info=True;database=db;password=pass" I think your concern is if oldGuids is on or off. In order to reproduce this issue you have to set the oldguids to false (the default). I think a test case should be simple enough, create a table on 5.1.x server with datatype char of length 12 and set its char set to utf8. Then do a simple select on it using the connector. I tried the Execute reader and the fill dataset but I think any action should work. Please note that the previous comments are just assumption by looking at the code, since I only tested this using a View (instead of a table). Therefore this problem might be related only to views..
[12 Oct 2009 11:52]
Tonci Grgin
Ok, taken into account.
[12 Oct 2009 12:15]
Christos Pavlides
Thanks Tonci and sorry that I don't have the time to create a test case, or even do some manual tests. I will try to do it as soon as possible if required, but I think the particular problem should be easy to spot.
[12 Oct 2009 12:35]
Tonci Grgin
DDL and test-results
Attachment: Bug47985.txt (text/plain), 3.11 KiB.
[12 Oct 2009 12:38]
Tonci Grgin
Christos, using following test case: MySqlConnection conn = new MySqlConnection(); conn.ConnectionString = "DataSource=**;Database=te**st;UserID=**;Password=**;PORT=**;logging=True;oldGuids = false;charset=utf8;"; conn.Open(); MySqlCommand cmd = conn.CreateCommand(); cmd.CommandTimeout = 50; cmd.CommandText = "SELECT * FROM bug47985;"; try { MySqlDataReader dr = cmd.ExecuteReader(); Console.WriteLine("T DataTypeName(1): " + dr.GetDataTypeName(1)); Console.WriteLine("T GetFieldType(1): " + dr.GetFieldType(1)); dr.Close(); cmd.CommandText = "SELECT * FROM vbug47985;"; dr = cmd.ExecuteReader(); Console.WriteLine("V DataTypeName(1): " + dr.GetDataTypeName(1)); Console.WriteLine("V GetFieldType(1): " + dr.GetFieldType(1)); dr.Close(); cmd.Dispose(); conn.Close(); } catch (Exception ex) { Console.Out.WriteLine(DateTime.UtcNow.ToLongTimeString() + " " + "Exception: " + ex.Message); throw; } and DDL statements attached, I am unable to reproduce the problem... T DataTypeName(1): VARCHAR T GetFieldType(1): System.String V DataTypeName(1): VARCHAR V GetFieldType(1): System.String Ideas?
[12 Oct 2009 12:41]
Tonci Grgin
Sorry, forgot to add most important parts of DDL: mysql> create table bug47985 (Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, VCCol VARCHAR(12) CHARSET utf8 COLLATE utf8_bin) CHARSET utf8; Query OK, 0 rows affected (0.04 sec) mysql> create view vbug47985 as select * from bug47985; Query OK, 0 rows affected (0.01 sec)
[12 Oct 2009 12:45]
Christos Pavlides
Tonci the column must be Char not VarChar
[12 Oct 2009 12:47]
Tonci Grgin
Ok, retesting.
[12 Oct 2009 12:54]
Tonci Grgin
True, verified as described both for table and for view... oldGuids = false CHAR column of length 12, UTF8 T DataTypeName(1): CHAR(36) T GetFieldType(1): System.Guid V DataTypeName(1): CHAR(36) V GetFieldType(1): System.Guid New DDL: mysql> create table bug47985 (Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, CCol CHAR(12) CHARSET utf8 COLLATE utf8_bin) CHARSET utf8; Query OK, 0 rows affected (0.03 sec) mysql> create view vbug47985 as select * from bug47985; Query OK, 0 rows affected (0.00 sec) mysql> select * from vbug47985; Field 1: `Id` Catalog: `def` Database: `test` Table: `vbug47985` Org_table: `vbug47985` Type: LONG Collation: binary (63) Length: 10 Max_length: 0 Decimals: 0 Flags: NOT_NULL PRI_KEY UNSIGNED AUTO_INCREMENT NUM PART_KEY Field 2: `CCol` Catalog: `def` Database: `test` Table: `vbug47985` Org_table: `vbug47985` Type: STRING Collation: utf8_general_ci (33) Length: 36 Max_length: 0 Decimals: 0 Flags: BINARY 0 rows in set (0.01 sec) mysql> select * from bug47985; Field 1: `Id` Catalog: `def` Database: `test` Table: `bug47985` Org_table: `bug47985` Type: LONG Collation: binary (63) Length: 10 Max_length: 0 Decimals: 0 Flags: NOT_NULL PRI_KEY UNSIGNED AUTO_INCREMENT NUM PART_KEY Field 2: `CCol` Catalog: `def` Database: `test` Table: `bug47985` Org_table: `bug47985` Type: STRING Collation: utf8_general_ci (33) Length: 36 Max_length: 0 Decimals: 0 Flags: BINARY
[12 Oct 2009 12:59]
Christos Pavlides
Thanks Tonci
[12 Oct 2009 13:07]
Christos Pavlides
This is my quick patch to solve the problem
Attachment: GuidIssue.patch (application/octet-stream, text), 1.71 KiB.
[23 Oct 2009 15:54]
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/commits/88012 781 Reggie Burnett 2009-10-23 - fixed guid type so that multi-byte character sets will not effect how it works. A column would be considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)
[23 Oct 2009 15:55]
Reggie Burnett
Fixed in 6.1.3+
[23 Oct 2009 19:03]
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/commits/88040 791 Reggie Burnett 2009-10-23 [merge] - fixed guid type so that multi-byte character sets will not effect how it works. A column would be considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)
[23 Oct 2009 19:04]
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/commits/88043 790 Reggie Burnett 2009-10-23 [merge] - fixed guid type so that multi-byte character sets will not effect how it works. A column would be considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)
[5 Nov 2009 16:18]
Tony Bedford
An entry has been added to the 6.1.3 changelog: For some character sets such as UTF-8, a CHAR column would sometimes be incorrectly interpreted as a GUID by MySQL Connector/NET. MySQL Connector/NET was changed so that a column would only be interpreted as a GUID if it had a character length of 36, as opposed to a byte length of 36.