SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.06.2008 12:05:49

star-ik
Участник
Зарегистрирован: 06.06.2008
Сообщений: 14

Работа в Юникоде UTF8

Задача:
Создать таблицу 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

Неактивен

 

#2 24.06.2008 13:05:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа в Юникоде UTF8

Как насчет

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);

Неактивен

 

#3 24.06.2008 16:53:59

star-ik
Участник
Зарегистрирован: 06.06.2008
Сообщений: 14

Re: Работа в Юникоде UTF8

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);

Попробовал, таблица создается, а данные не загружаются....

Неактивен

 

#4 24.06.2008 17:11:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа в Юникоде UTF8

Что значит "не загружаются"? Возникает ошибка?

Файлик должен лежать на сервере, на котором выполняется команда. Ну и, разумеется,
нужно правильно указать путь до него. Также нужно, чтобы данные были разделены
табуляцией, в противном случае нужно подправить команду LOAD DATA INFILE.

Неактивен

 

#5 25.06.2008 10:33:31

star-ik
Участник
Зарегистрирован: 06.06.2008
Сообщений: 14

Re: Работа в Юникоде UTF8

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)

Неактивен

 

#6 25.06.2008 11:29:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа в Юникоде UTF8

Файл у Вас хорошего формата, но вот путь к файлу Вы задаете в формате,
который MySQL не может читать.

MySQL не умеет получать файлы по HTTP. Он может читать только локальные
файлы. Соответственно, файл должен лежать локально на сервере. Более того,
для выполнения этой команды, Вам нужна привилегия FILE. Возможно, проще
выполнить импорт на локальном для Вас сервере (например, на Вашем компьютере),
экспортировать данные с помощью mysqldump и потом импортировать уже на
хостинге.

По поводу explode - боюсь, не скажу. Есть предположение, что используемый
PHP не умеет работать с unicode.

Неактивен

 

#7 25.06.2008 14:49:01

star-ik
Участник
Зарегистрирован: 06.06.2008
Сообщений: 14

Re: Работа в Юникоде UTF8

В тех поддержке хостера сказали, что у них выделенные 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)

Неактивен

 

#8 25.06.2008 15:12:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа в Юникоде UTF8

Обычно LOCAL отключен по соображениям безопасности. Но раз у Вас работает, то это замечательно smile

Неактивен

 

#9 25.06.2008 16:15:09

star-ik
Участник
Зарегистрирован: 06.06.2008
Сообщений: 14

Re: Работа в Юникоде UTF8

Спасибо.
На самом деле все работает!
Правда все текстовые файлы пришлось переводить в ANSI (cp1251), а то получалась двойная перекодировка.
Сейчас нужно создать много таблиц в базе данных из текстовых файлов, поэтому команда LOAD DATA INFILE, предложенная Вами, сняла много проблем.
В дальнейшем работа будет с дампом БД.

Неактивен

 

#10 25.06.2008 17:08:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа в Юникоде UTF8

LOAD DATA INFILE умеет принимать кодировку файла в качестве параметра - может
спасти еще пару десятков минут wink

Неактивен

 

#11 26.06.2008 14:20:33

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: Работа в Юникоде UTF8

James написал:

Почему команда explode("\t", $massive_ip{$i}); не правильно работает с Юникодом UTF8?
т.е. пропадает часть информации...

Вам необходимо использовать mbstring
обратите внимание на mbstring.func_overload который позволит перегрузить split() как mb_split()
или подождать PHP6 - там utf8 будет по умолчанию ; )

Неактивен

 

#12 26.06.2008 14:26:36

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа в Юникоде UTF8

Классно, есть на этом форуме люди, которые понимают, как работает PHP smile

Неактивен

 

#13 26.06.2008 22:45:24

star-ik
Участник
Зарегистрирован: 06.06.2008
Сообщений: 14

Re: Работа в Юникоде UTF8

Sign написал:

Вам необходимо использовать mbstring
обратите внимание на mbstring.func_overload который позволит перегрузить split() как mb_split()
или подождать PHP6 - там utf8 будет по умолчанию ; )

Спасибо за подсказку, обязательно попробую!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson