mysql varchar2 переполнение строки - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть сервер MySQL 5.1.50. я недавно создал файл дампа для некоторых старых таблиц с данными, преобразованными из старых версий mysql. во время импорта я получил сообщения «Данные обрезаны для столбца». короткий поиск показал, что есть строки со значениями varchar, которые превышают определенное значение таблицы varchar.

  1. как это возможно? безуспешно пытался воссоздать его, кто-нибудь сталкивался с таким состоянием?
  2. как мне найти проблемные строки без полной таблицы, сканирующей всю БД?
  3. самое важное, могут ли это быть исправления (опять же, с простым решением, полная справка по drop-create не поможет)

из дБ (данные скрыты, но реальные выборки):

desc xxx

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| date           | date             | NO   | MUL | NULL    |                |
| int1           | int(10) unsigned | NO   |     | NULL    |                |
| v1             | varchar(200)     | NO   |     | NULL    |                |
| v2             | varchar(200)     | NO   |     | NULL    |                |
| i2             | int(10) unsigned | NO   |     | NULL    |                |
| i3             | int(10) unsigned | NO   |     | NULL    |                |
| f1             | float            | NO   |     | NULL    |                |
| f2             | float            | NO   |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+

select count(id) from xxx where length(v1)>200 group by length(v1);

+-----------+------------------+
| count(id) | length(v1)       |
+-----------+------------------+
|         7 |              201 |
|         1 |              202 |
|         1 |              203 |
|         5 |              204 |
|         1 |              205 |
|         1 |              206 |
|         5 |              207 |
|         9 |              208 |
|         4 |              209 |
|         1 |              210 |
|        67 |              212 |
|        13 |              214 |
|         1 |              215 |
|         1 |              216 |
|         2 |              220 |
|         2 |              221 |
|         2 |              230 |
|         2 |              235 |
|         1 |              274 |
|         1 |              290 |
|         1 |              320 |
+-----------+------------------+

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011
  1. Кажется, что по крайней мере некоторые из строковых значений являются многобайтовыми (length() возвращает размер в байтах, char_length() - размер в символах
  2. SELECT * FROM your_table WHERE LENGTH(v1) != CHAR_LENGTH(v1)
  3. Обычно скрипт импорта / экспорта должен позаботиться о таких вещах (при условии, что ваш целевой сервер поддерживает многобайтовые символы). Какой инструмент вы используете для экспорта / импорта? Насколько я знаю, у mysqldump такой проблемы нет.
0 голосов
/ 11 декабря 2011

Определите ваши поля varchar, чтобы быть больше, чем 200 символов.

Значения в столбцах VARCHAR являются строками переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в 5.0.3 и более поздних версиях. Максимальная эффективная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который распределяется между всеми столбцами) и используемого набора символов.

Подробнее читайте в руководстве MySQL

То, что говорит вышеупомянутое утверждение, состоит в том, что вы можете определить столбцы varchar длиной более 255, как долго сумма размеров всех столбцов varchar из этой таблицы не превышает 65 535 Чтобы быть более конкретным, вы можете изменить столбцы таблицы:

ALTER TABLE xxx CHANGE v1 v1 VARCHAR(500);
...