diff --git a/mysql-test/main/column_compression.result b/mysql-test/main/column_compression.result index ace65387181..c783e7fd1e9 100644 --- a/mysql-test/main/column_compression.result +++ b/mysql-test/main/column_compression.result @@ -1472,3 +1472,17 @@ SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) aaaaaaaaaa 255 DROP TABLE t1; +# +# MDEV-16729 VARCHAR COMPRESSED is created with a wrong length for multi-byte character sets +# +CREATE OR REPLACE TABLE t1 (a VARCHAR(1000) CHARACTER SET utf8 COMPRESSED); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(1000) /*!100301 COMPRESSED*/ CHARACTER SET utf8 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +COLUMN_TYPE +varchar(1000) /*!100301 COMPRESSED*/ +DROP TABLE t1; diff --git a/mysql-test/main/column_compression.test b/mysql-test/main/column_compression.test index f3220503694..c9d0014ab9e 100644 --- a/mysql-test/main/column_compression.test +++ b/mysql-test/main/column_compression.test @@ -170,3 +170,14 @@ CREATE TABLE t1(a TINYTEXT COMPRESSED); INSERT INTO t1 VALUES(REPEAT('a', 255)); SELECT LEFT(a, 10), LENGTH(a) FROM t1; DROP TABLE t1; + + +--echo # +--echo # MDEV-16729 VARCHAR COMPRESSED is created with a wrong length for multi-byte character sets +--echo # + +CREATE OR REPLACE TABLE t1 (a VARCHAR(1000) CHARACTER SET utf8 COMPRESSED); +SHOW CREATE TABLE t1; +SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +DROP TABLE t1; diff --git a/sql/field.cc b/sql/field.cc index efc20fa37fc..4c0f1b0560b 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7715,10 +7715,9 @@ void Field_varstring::sql_type(String &res) const size_t length; length= cs->cset->snprintf(cs,(char*) res.ptr(), - res.alloced_length(), "%s(%d)", + res.alloced_length(), "%s(%u)", (has_charset() ? "varchar" : "varbinary"), - (int) field_length / charset()->mbmaxlen - - MY_TEST(compression_method())); + (uint) char_length()); res.length(length); if ((thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) && has_charset() && (charset()->state & MY_CS_BINSORT))