1

Тема: При импорте CSV - ругается на большую длину строки...

День добрый!
Недавно начал изучать PHP, столкнулся некоторыми траблами. Сначала немного о том что имею: на машине под WinXP установлены Apache/2.4.3 (Win32) PHP/5.4.11 , phpMyAdmin 4.0.0. Максимальные размеры импортируемых в SQL файлов увеличил в настройках до 300 мб.

При импорте CSV базы 70 мб (10 тыс.строк, 8 столбцов) возникает ошибка. Насколько понял - SQL по умолчанию создает для строковых переменных массив из CHAR, а не STRING. Одно из полей в одной из записей базы больше, чем максимальный размер массива CHAR.

ВОПРОС №1:
Можно ли в первой строке, где прописываются заголовки столбцов указывать не только наименование полей, но и типы этих полей?
Или это можно сделать только принудительно, создав сначала наименования и типы полей, а потом уже импортировать базу?

ВОПРОС №2:
phpMyAdmin внизу на красном фоне выводит рекомендацию в виде:

При работе с многобайтными кодировками без установленного расширения PHP "mbstring", phpMyAdmin не в состоянии производить корректное разбиение строк, что может привести к непредсказуемым результатам. Установите расширение PHP "mbstring".

Не нашёл с ходу на официальном сайте инстальник расширения mbstring , подскажите где найти на официальном сайте это расширение?

Прошу ответить, если кто знает ответ хотя бы на один вопрос.

2

Re: При импорте CSV - ругается на большую длину строки...

Стёр из CSV файла заголовок с наименованием полей.
Стёр содержимое уже загруженных строк в таблице table1.
Изменил типы переменных столбцов с массива char на tinytext в table1.
Попытался загрузить (импортировать) в table1 данные из CSV файла без первой строчки с наименованиями заголовков столбцов.
База начала шустро импортироваться, и как в очередной раз на этом состоянии зависла (на 81%).
http://s4.uploads.ru/Jl5nW.png

Попытался ещё раз - загрузилась до 96%.
http://s5.uploads.ru/ZCx3a.png

А затем выскакивает одна и та же ошибка, на красном фоне со следующим содержимым:

Ошибка
SQL-запрос:

CREATE TABLE IF NOT EXISTS  `test`.`TABLE 2` (

`COL 1` INT( 6 ) ,
`COL 2` VARCHAR( 56 ) ,
`COL 3` INT( 10 ) ,
`COL 4` VARCHAR( 19 ) ,
`COL 5` VARCHAR( 53667 ) ,
`COL 6` INT( 5 ) ,
`COL 7` VARCHAR( 10 ) ,
`COL 8` VARCHAR( 10 ) ,
`COL 9` VARCHAR( 10 )
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Ответ MySQL: Документация

#1074 - Column length too big for column 'COL 5' (max = 21845); use BLOB or TEXT instead

Судя по тексту - MySQL почему создаёт новую таблицу table2 и пытается импортировать данные в неё.

PS: сижу, чешу затылок... думаю что не так... какие будут соображения?

3

Re: При импорте CSV - ругается на большую длину строки...

tel сказал:

Или это можно сделать только принудительно, создав сначала наименования и типы полей, а потом уже импортировать базу?

Только так.

tel сказал:

Не нашёл с ходу на официальном сайте инстальник расширения mbstring , подскажите где найти на официальном сайте это расширение?

В php.ini раскомментируйте строку:

extension=php_mbstring.dll
tel сказал:

Судя по тексту - MySQL почему создаёт новую таблицу table2 и пытается импортировать данные в неё.

Выберите таблицу в которую надо импортировать и затем перейдите на вкладку импорта. Тип данных для поля COL 5 выберите не tinytext, а TEXT.

4 (изменено: tel, 2013-08-18 23:05:00)

Re: При импорте CSV - ругается на большую длину строки...

Hanut сказал:

Выберите таблицу в которую надо импортировать и затем перейдите на вкладку импорта. Тип данных для поля COL 5 выберите не tinytext, а TEXT.

Да делал именно так много раз уже.

Только он, зараза такая, создаёт новую таблицу TABLE2 и в неё пытается импортнуть базу. А не в текущую выбранную TABLE1.

Хотя при нахождении во вкладке импорта --- показывает, что будет импортировать базу в TABLE1.

В итоге, решил действовать по дуболомному. Максимальная длина массива VARCHAR = 21845 символов.
Я создал три поля, разбил тексты на размеры, длиной не более 21000 символов.
Начал импортировать - он теперь новую ошибку выдает на красном фоне:

Ошибка
SQL-запрос:

CREATE TABLE IF NOT EXISTS `mmm`.`TABLE 1` (
...
...далее описания полей с размерами полей = максимально найденным длинам переменных...
...

Ответ MySQL:
#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Вот этого - вообще не понял.
Длина самой максимальной текстовой строчки 39000 символов, а он пишет про какие то 65535.

5

Re: При импорте CSV - ругается на большую длину строки...

Ошибка указывает на ограничение максимальной длинны строки для используемого типа таблицы. Даже не знаю чем помочь.