Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: пакетная загрузка данных
 
 автор: Елена Слободян   (28.01.2011 в 19:47)   письмо автору
 
 

пытаюсь вот осуществить пакетную загрузку данных в таблицу. Таблица из двух столбцов, первый - цифровое значение, второй текстовое поле. Пытаюсь с помощью оператора load data infile. Сначала выдавал ошибку incorrect string value for column name at row 1, вторая колонка то есть ему не нравилась. Оказалось, дело в кодировке файла txt. Была ainsi, а на сервере utf я установила. Ладно, поменяла кодировку, теперь он выдает такую ошибку: incorrect integer value for column id at row 1. Чем ему циферки-то не нравятся??? А если вводить значения из командной строки, то он тогда кириллицу не воспринимает. Нужно базы данных с текстовыми данными на русском и польском языках. Как решить эту проблему?

  Ответить  
 
 автор: cheops   (29.01.2011 в 12:50)   письмо автору
 
   для: Елена Слободян   (28.01.2011 в 19:47)
 

Хорошо бы увидеть кусочек текствого файла (а лучше его вообще прикрепить к сообщению) и структуру таблицы (SHOW CREATE TABLE tbl).

>А если вводить значения из командной строки, то он тогда кириллицу не воспринимает.
Кодировку консоли тоже настраивать надо, там по умолчанию идет древняя кодировка 866, которую нужно менять на 1251 (или другую нужную вам). Для этого используется команда chcp.

  Ответить  
 
 автор: Елена Слободян   (29.01.2011 в 23:14)   письмо автору
81 байт
 
   для: cheops   (29.01.2011 в 12:50)
 

текстовый файл небольшой. Вот такой

  Ответить  
 
 автор: Елена Слободян   (29.01.2011 в 23:23)   письмо автору
231 Кб
 
   для: Елена Слободян   (29.01.2011 в 23:14)
 

А вот снимок командной строки.

  Ответить  
 
 автор: sim5   (29.01.2011 в 23:49)   письмо автору
 
   для: Елена Слободян   (29.01.2011 в 23:14)
 

У вас поле id как text определено, зачем? Зачем для столько короткого текста (судя по файлу) поле name также имеет тип text? А почему именно файлом?

  Ответить  
 
 автор: cheops   (30.01.2011 в 00:00)   письмо автору
 
   для: sim5   (29.01.2011 в 23:49)
 

UTF-8 через LOAD DATA иначе не удается загрузить, вероятно в начале был INT, но в процессе экспериментов он преобразовался в TEXT. В конце концов потом можно будет его обратно в INT переделать.

  Ответить  
 
 автор: cheops   (29.01.2011 в 23:58)   письмо автору
93 байт
 
   для: Елена Слободян   (29.01.2011 в 23:14)
 

Судя по всему, у вас в начале файл стоит невидимый признак начала UTF-8 файла, он приплюсовывается к 1 и поэтому первое значение не может вставиться в числовое поле. Если поля строковые, как у вас указано ниже, то все вставляется (за исключением первого значения 1) при помощи запроса
LOAD DATA INFILE 'С:\\MySQL\\bin\\hello.txt' INTO TABLE hw1;

Только путь нужно указывать полный и у LOAD DATA INFILE как всегда проблема с кодировкой - как не настраивал консоль, не удалось его с UTF-8 подружить.

Мне удалось корректно загрузить в вашу таблицу файл, который прикреплен к сообщению через Импорт phpMyAdmin. Если возможно безболезненно добавить кавычки - возможно это выход из ситуации.

  Ответить  
 
 автор: Trianon   (30.01.2011 в 12:05)   письмо автору
15 Кб
 
   для: cheops   (29.01.2011 в 23:58)
 

Кодировка файла, который воспринимает LOAD DATA INFILE может быть указана в этом операторе только с версии сервера 5.1.17
Если сервер более ранний, как у меня например, то эта кодировка должна соответствовать кодировке выбранной БД.
Чтобы LOAD DATA INFILE корректно заработал, нужно также учесть, что либо строки в файле должны заканчиваться в unix-стиле, либо придется в операторе явно указать, какими символами они заканчиваются.
Проблему ByteOrderMark-символа, стоящего в файле в начале перед текстом решить сложнее.
Конечно, самое простое - отрезать его - если позволяет текстовый редактор.
Если же исходить из предположения, что файл с таким началом был сформирован стандартным notepad (а тот не сможет поместить текст в utf-8, не оставив при этом BOM) - можно предложить следующее:
1. Вставить в начало файла 1 пустую строку.
2. Воспользоваться возможностью оператора LOAD DATA игнорировать задданное число строк файла.
Файл с текстом (81.txt) был взят из поста (29.01.2011 в 23:14) и дополнен сверху пустой строкой.
Вот так выглядел сеанс работы с SQL (велся по привычке в штатной консольной 866-й кодировке)

Кодировка соединения соответствует кодировке консоли.

D:\>chcp 866
Active code page: 866

D:\>mysql -u testuser -ptestpwd dbu8
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 112
Server version: 5.0.45-community-nt MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use dbu8;
Database changed
mysql> set names cp866;
Query OK, 0 rows affected (0.00 sec)


Кодировка БД соответствует кодировке файла
mysql> show create database dbu8;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| dbu8     | CREATE DATABASE `dbu8` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)


Кодировка полей таблицы также UTF-8
mysql> show create table hw1;
+-------+----------------------------------------------------------------------
| Table | Create Table
+-------+----------------------------------------------------------------------
| hw1   | CREATE TABLE `hw1` (
  `id` int(11) NOT NULL auto_increment,
  `name` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------
1 row in set (0.00 sec)


Загружаем файл:
mysql> load data infile 'd:/81.txt' into table hw1 lines terminated by '\r\n'
    -> ignore 1 lines;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0


Смотрим результат:
mysql> select *, char_length(name), octet_length(name) from hw1;
+----+---------------------+-------------------+--------------------+
| id | name                | char_length(name) | octet_length(name) |
+----+---------------------+-------------------+--------------------+
|  1 | Вселенная           |                 9 |                 18 |
|  2 | Человек             |                 7 |                 14 |
|  3 | Человек и Вселенная |                19 |                 36 |
+----+---------------------+-------------------+--------------------+
3 rows in set (0.00 sec)

mysql>


Как видим, данные спокойно загрузились, без ошибок и в корректной кодировке.
В аттаче пруфпик :)

  Ответить  
 
 автор: Елена Слободян   (30.01.2011 в 20:04)   письмо автору
 
   для: Trianon   (30.01.2011 в 12:05)
 

Спасибо за исчерпывающий ответ. Если еще актуальны ответы на первые вопросы, то поле id как текст в результате экспериментов :) Ни так, ни так грузить не хотел :) нейм тоже текст, потому что так в учебнике было. А я только начала учиться этому всему, ну и решила особо не отступать пока. Почему именно из файла: ну я рассуждала, что всяко я эти данные для нужных баз вручную вводить не буду, а буду из файла, там будут довольно большие куски текста, вот и решила сразу научиться их импортировать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования