Задавайте вопросы, мы ответим
Вы не зашли.
Задача:
Создать таблицу sklad, используя кодировку utf8.
id box name
——|———|————————
Данные для заполнения таблицы взять из файла sklad.txt (создан в кодировке utf8)
n1 Склад № 1
n2 Склад № 2
n3 Склад № 3
Делаем все это с помощью следующего скрипта:
<? // Открытие файла txt, для создания массива и выделения данных. $massive_ip = file("sklad.txt"); if(!$massive_ip) { echo("Ошибка открытия файла<br>"); } else // Соединение с MySQL server. Проверка логина и пароля. $connection = mysql_connect ($baseURL, $username, $password); if (!$connection) { die('Нет соединения с Базой Данных: ' . mysql_error()); } // Проверка MySQL database $db_selected = mysql_select_db($database, $connection); if (!$db_selected) { die ('Невозможно использовать Базу данных: ' . mysql_error()); } // Установка режима Юникод utf8 $db_set=mysql_query("SET NAMES utf8"); // Удалить из Базы Данных таблицу $table $drop_table = "DROP TABLE sklad"; mysql_query($drop_table); // Создание таблицы $table в Базе Данных $create_table = "CREATE TABLE sklad( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `box` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ) ENGINE = MYISAM ;"; mysql_query($create_table); if (!$create_table) { die('Невозможно создать таблицу: ' . mysql_error()); } // Выделение данных из массива, полученного из файла txt. { for($i=0; $i < count($massive_ip); $i++) { list($box, $name) = explode("\t", $massive_ip{$i}); { //Добавление новых строк в таблицу $table $query = sprintf("INSERT INTO sklad" . "(id, box, name)" . " VALUES (NULL, '%s', '%s' );", mysql_real_escape_string($box), mysql_real_escape_string($name)); mysql_query($query); if (!$query) {die('Неверный запрос: ' . mysql_error());} } } } echo "Данные из файла sklad.txt загружены в таблицу!"; ?>
В результате получаем следующую таблицу с данными:
id box name
——|———|————————
1 n Склад № 1
2 n2 Склад № 2
3 n3 Склад № 3
Если все это сделать в кодировке ANSI (cp1251), то таблица будет заполнена правильно,
но необходимо, что бы данные были кодировке utf8, т.к. в дальнейшем
будут использоваться с картами GOOGLE, а там используется кодировка utf8.
Помогите разобраться, пожалуйста...
PS.
Эта тема связана непосредственно с http://sqlinfo.ru/forum/viewtopic.php?id=693
Неактивен
Как насчет
SET NAMES utf8;
CREATE TABLE sklad (id INT NOT NULL PRIMARY KEY, box CHAR(2), name VARCHAR(20)) DEFAULT CHARACTER SET utf8;
LOAD DATA INFILE 'sklad.txt' INTO TABLE sklad (box, name);
Неактивен
paulus написал:
Как насчет
SET NAMES utf8;
CREATE TABLE sklad (id INT NOT NULL PRIMARY KEY, box CHAR(2), name VARCHAR(20)) DEFAULT CHARACTER SET utf8;
LOAD DATA INFILE 'sklad.txt' INTO TABLE sklad (box, name);
Попробовал, таблица создается, а данные не загружаются....
Неактивен
Что значит "не загружаются"? Возникает ошибка?
Файлик должен лежать на сервере, на котором выполняется команда. Ну и, разумеется,
нужно правильно указать путь до него. Также нужно, чтобы данные были разделены
табуляцией, в противном случае нужно подправить команду LOAD DATA INFILE.
Неактивен
James написал:
Что значит "не загружаются"? Возникает ошибка?
Не загружаются, значит в таблице нет записей!
После подключения к базе выполняю код, который Вы мне рекомендовали:
mysql_query("SET NAMES utf8"); mysql_query("CREATE TABLE sklad (id INT NOT NULL PRIMARY KEY, box CHAR(2), name VARCHAR(20)) DEFAULT CHARACTER SET utf8"); mysql_query("LOAD DATA INFILE 'http://mysite.ru/mydir/sklad.txt' INTO TABLE sklad (box, name)");
Таблица создается в соответствии с запросом, а команда LOAD DATA INFILE не выполняется, т.е. в таблицу данные не попадают!
Файл sklad.txt имеет следующую структуру:
n1\tСклад № 1\n
n2\tСклад № 2\n
n3\tСклад № 3\n
и лежит на сервере на котором выполняется команда.
PS
По поводу кода, который я показал в самом начале.
Почему команда explode("\t", $massive_ip{$i}); не правильно работает с Юникодом UTF8?
т.е. пропадает часть информации...
Отредактированно star-ik (25.06.2008 10:50:13)
Неактивен
Файл у Вас хорошего формата, но вот путь к файлу Вы задаете в формате,
который MySQL не может читать.
MySQL не умеет получать файлы по HTTP. Он может читать только локальные
файлы. Соответственно, файл должен лежать локально на сервере. Более того,
для выполнения этой команды, Вам нужна привилегия FILE. Возможно, проще
выполнить импорт на локальном для Вас сервере (например, на Вашем компьютере),
экспортировать данные с помощью mysqldump и потом импортировать уже на
хостинге.
По поводу explode - боюсь, не скажу. Есть предположение, что используемый
PHP не умеет работать с unicode.
Неактивен
В тех поддержке хостера сказали, что у них выделенные MySql сервера!
Так что запрос : mysql_query("LOAD DATA INFILE 'sklad.txt' INTO TABLE sklad (box, name)"); выполняться не будет.
Поэтому я решил:
Раз MySql сервера - выделенные, то значит файл у меня получается на клиентском хосте, следовательно запрос должен быть таким:
mysql_query("LOAD DATA LOCAL INFILE 'sklad.txt' INTO TABLE sklad (box, name)");
таблица заполнилась!
Правда при создании таблицы пришлось добавить "AUTO_INCREMENT"
В итоге:
mysql_query("SET NAMES utf8"); mysql_query("CREATE TABLE sklad ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, box CHAR(2), name VARCHAR(20)) DEFAULT CHARACTER SET utf8"); mysql_query("LOAD DATA LOCAL INFILE 'sklad.txt' INTO TABLE sklad (box, name)");
Отредактированно star-ik (25.06.2008 15:03:51)
Неактивен
Обычно LOCAL отключен по соображениям безопасности. Но раз у Вас работает, то это замечательно
Неактивен
Спасибо.
На самом деле все работает!
Правда все текстовые файлы пришлось переводить в ANSI (cp1251), а то получалась двойная перекодировка.
Сейчас нужно создать много таблиц в базе данных из текстовых файлов, поэтому команда LOAD DATA INFILE, предложенная Вами, сняла много проблем.
В дальнейшем работа будет с дампом БД.
Неактивен
LOAD DATA INFILE умеет принимать кодировку файла в качестве параметра - может
спасти еще пару десятков минут
Неактивен
James написал:
Почему команда explode("\t", $massive_ip{$i}); не правильно работает с Юникодом UTF8?
т.е. пропадает часть информации...
Вам необходимо использовать mbstring
обратите внимание на mbstring.func_overload который позволит перегрузить split() как mb_split()
или подождать PHP6 - там utf8 будет по умолчанию ; )
Неактивен
Классно, есть на этом форуме люди, которые понимают, как работает PHP
Неактивен
Sign написал:
Вам необходимо использовать mbstring
обратите внимание на mbstring.func_overload который позволит перегрузить split() как mb_split()
или подождать PHP6 - там utf8 будет по умолчанию ; )
Спасибо за подсказку, обязательно попробую!
Неактивен