SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.04.2010 22:39:13

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Длина данных типа VARCHAR

Ребята, привет!

Подскажите, пожалуйста, почему такая картина. Судя по данным, приведенным ниже, для версии MySQL 5.0.45 я вполне должен быть способен создать поле типа VARCHAR длиной 65535 символов, почему при попытке создать поле такой длины, движок принимает за меня решение назначить этому полю тип MEDIUMTEXT?

dev.mysql.com написал:

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions. The effective maximum length of a VARCHAR in MySQL 5.0.3 and later is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used.

mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.0.45-community-nt-log |
+-------------------------+
mysql> CREATE TABLE  `test` ( `word` VARCHAR( 65535 ) NOT NULL );
mysql> describe test;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| word  | mediumtext | NO   |     |         |       |
+-------+------------+------+-----+---------+-------+
mysql> ALTER TABLE test CHANGE  `word`  `word` VARCHAR( 30000 );
mysql> describe test;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| word  | mediumtext | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
mysql> ALTER TABLE test CHANGE  `word`  `word` VARCHAR( 20000 );
mysql> describe test;
+-------+----------------+------+-----+---------+-------+
| Field | Type           | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| word  | varchar(20000) | YES  |     | NULL    |       |
+-------+----------------+------+-----+---------+-------+

Отредактированно FiMko (20.04.2010 23:20:22)

Неактивен

 

#2 20.04.2010 22:44:19

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Длина данных типа VARCHAR

Блин кажись допёр - utf8, умножаем всё на два big_smile!
Хотя 65535/2=32767 с копеками hmm...

Отредактированно FiMko (20.04.2010 22:46:16)

Неактивен

 

#3 20.04.2010 22:46:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Длина данных типа VARCHAR

Судя по всему вы используете кодировку utf8, т.е. для хранения одного символа требуется три байта, а для хранения максимально возможного для данного типа количества символов потребуется 3 × 65,535 = 196,605 байт. Данное количество превышает длину данных в байтах, которую может содержать тип данных VARCHAR(65535), поэтому MySQL преобразует тип данных в MEDIUMTEXT, который является наименьшим из строковых типов, для которого длина данных в байтах может равняться 196,605.

Вот если бы вы использовали кодировку, например, latin1, то смогли бы создать VARCHAR(65535)

Неактивен

 

#4 20.04.2010 22:47:02

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Длина данных типа VARCHAR

vasya написал:

Судя по всему вы используете кодировку utf8, т.е. для хранения одного символа требуется три байта, а для хранения максимально возможного для данного типа количества символов потребуется 3 × 65,535 = 196,605 байт. Данное количество превышает длину данных в байтах, которую может содержать тип данных VARCHAR(65535), поэтому MySQL преобразует тип данных в MEDIUMTEXT, который является наименьшим из строковых типов, для которого длина данных в байтах может равняться 196,605.

Вот если бы вы использовали кодировку, например, latin1, то смогли бы создать VARCHAR(65535)

Точно три байта, а не два. Спасибо!

Гы, интересно, а на граничном значении движок решил меня предупредить:

mysql> ALTER TABLE test CHANGE  `word`  `word` VARCHAR( 21845 );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

Уже для значения 21846 он (движок) предупреждать не будет - конвертирует в mediumtext. Ну а для 21844 и вовсе укладываемся big_smile
Также хочу предупредить в некоторых самоучителях указана длина текстового поля VARCHAR = 65535 символов, это, конечно, не так, это длина в байтах.

Отредактированно FiMko (20.04.2010 23:03:23)

Неактивен

 

#5 20.04.2010 23:34:13

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Длина данных типа VARCHAR

vasya написал:

Вот если бы вы использовали кодировку, например, latin1, то смогли бы создать VARCHAR(65535)

ALTER TABLE  `test` CHANGE  `word`  `word` VARCHAR( 65535 ) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL
#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

Теперь для ascii_general_ci:

ALTER TABLE  `test` CHANGE  `word`  `word` VARCHAR( 65533 ) CHARACTER SET ascii COLLATE ascii_general_ci DEFAULT NULL
#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
ALTER TABLE  `test` CHANGE  `word`  `word` VARCHAR( 65532 ) CHARACTER SET ascii COLLATE ascii_general_ci DEFAULT NULL
mysql> describe test;
+-------+----------------+------+-----+---------+-------+
| Field | Type           | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| word  | varchar(65532) | YES  |     | NULL    |       |
+-------+----------------+------+-----+---------+-------+

hmm
---
для latin1_general_ci 65532 тоже прокатывает...

Отредактированно FiMko (20.04.2010 23:39:30)

Неактивен

 

#6 20.04.2010 23:43:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Длина данных типа VARCHAR

Сделайте NOT NULL и спасете еще один байт, а 2 байта под длину строки.

Неактивен

 

#7 20.04.2010 23:45:00

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Длина данных типа VARCHAR

rgbeast написал:

Сделайте NOT NULL и спасете еще один байт, а 2 байта под длину строки.

Вот так вот по байтику по байтику big_smile... Спасибо, rgbeast!

Неактивен

 

#8 21.04.2010 11:24:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Длина данных типа VARCHAR

На самом деле, самоучители тоже не врут — в VARCHAR(21845) Вы сможете засунуть
не более 21845 символов. А вот ограничение на максимальную длину VARCHAR —
в байтах. Некоторая путаница, но связана она с адресацией в 2 байта, поэтому понятна smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson