Текстовые типы столбцов и UTF-8

Royal Flash

-=MaestrO=-
Читая мануал по MySQL наткнулся на раздел, посвященный конвертации БД из одной кодировки в другую, где написано, что при смене кодировки таким запросом:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
может быть изменен тип столбца, если данные в этом столбце превышают максимально допустимый размер столбца. Т.е. если в столбце типа VARCHAR хранится 255 русских символов, то при смене кодировки с cp1251 на utf8 тип преобразуется TEXT.

Проверил - после конвертации, как было 255 русских символов в кодировке cp1251 так их и осталось 255 в utf8, причем тип столбца не изменился, и остался VARCHAR.

В мануале Требования к памяти для различных типов столбцов ясно написано, что столбец типа VARCHAR может содержать максимум 255 байт. Как же тогда в него поместилось аж 510 байт данных, которые занимают русские 255 символов в utf8?

Ниже - тестовый скрипт, которым можно это проверить:

PHP:
mb_internal_encoding('UTF-8');
setlocale (LC_ALL, "ru_RU.UTF-8");
header('Content-type: text/html; charset=utf-8');

$mysqlhost = 'localhost';
$mysqlusers = '';
$mysqlpass = '';
$dbname = '';

$db = mysql_connect($mysqlhost, $mysqlusers, $mysqlpass);
mysql_select_db($dbname);
mysql_query('SET NAMES utf8');

for ($i = 0; $i < 255; $i++)
  {
  $str_out .= 'б';
  }

mysql_query('DELETE FROM 1test');  
  
$query = 'INSERT 1test SET varchar_type = "'.  mysql_real_escape_string($str_out).'"';
mysql_query($query);

$query = 'SELECT varchar_type FROM 1test';
$result = mysql_query($query);
$row = mysql_fetch_row($result);
echo 'Сгенерированно символов: '.strlen($str_out).' байт; '.mb_strlen($str_out).'шт.<br>';
echo 'Получено из MySQL символов: '.strlen($row[0]).' байт; '.mb_strlen($row[0]).'шт.';
SQL для создания таблицы:

CREATE TABLE IF NOT EXISTS `1test` (
`varchar_type` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
Сверху