Текстовый тип данных в MySQL усечен до 32 КБ - PullRequest
1 голос
/ 09 мая 2011


У меня есть скрипт php, который вставляет статьи в БД mysql.тип поля в MySQL - это текст.
Теперь, когда я вставляю статью размером более 32 КБ, она усекается только до 32 КБ.я знаю, что максимальный размер текста в mysql составляет 64 КБ.
PS: версия mysql - 5.0.51a-24 + lenny5
Версия PHP: PHP 5.3.2-1ubuntu4.9
mysql:max_allowed_packet = 16M

есть идеи, почему mysql обрезает его или как его исправить ??
** EDIT **
мой набор символов utf8
отвыбрав гекс из этого поля, я получил 65768, и, как вы знаете, каждые две шестнадцатеричные цифры представляют один байт, и, таким образом, здесь фактический размер составляет 65768/2 = 32884

mysql> select length(hex(body)), length(body) from articles  where article_id=62727;
+-------------------+--------------+
| length(hex(body)) | length(body) |
+-------------------+--------------+
|             65768 |        32884 | 
+-------------------+--------------+

Спасибо за вашу помощь

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Тип TEXT имеет длину 64 Кбайт, а не Символы, поэтому, если вы используете набор символов, использующий более одного байта на символ, эта ошибка может возникнуть.

В вашем случае строка всегдаусеченный до 32k, похоже, что вы используете набор символов UTF-16, для которого требуется два байта на символ.

У вас есть две возможности:

  1. Использовать однобайтовый символset
  2. Использовать столбец большего типа
1 голос
/ 09 мая 2011

From: http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

Столбец TEXT с максимальной длиной 65 535 (2 ^ 16 - 1) символов.Эффективная максимальная длина меньше, если значение содержит многобайтовые символы.

Таким образом, максимальная длина 64 тыс. Символов возможна только с набором символов, подобным ANSI.UTF-8, например, использует более одного байта для кодирования символа и, следовательно, меньше текста может быть сохранено в 2 ^ 16 байтов.

...