Архів рубрики: Програмування

Як витягнути дані з MySQL у звичайний текстовий файл

Гадаю, користуватися mysqldump вміють усі, але іноді потрібно з бази даних MySQL витягнути лише дані – без форматування та SQL синтаксису. Наприклад, вам потрібен перелік користувачів з таблиці users, тобто звичайний текстовий файл, де ім’я кожного користувача займає окремий рядок.

Мені потрібно було зібрати в одному текстовому файлі тексти, що написані італійською. Запит мовою SQL для цього запиту використовувався такий:

mysql> SELECT text FROM comments WHERE language = "it";

Але як спрямувати його до текстового файлу? Виявляється є стандартна команда INTO OUTFILE:

mysql> SELECT text FROM comments WHERE language = "it"
 INTO OUTFILE "comments_it.txt";
Query OK, 3852 rows affected (0.00 sec)

Спрацювала вона добре, але де ж цей файл comments_it.txt? Я шукав його так:

$ sudo -s
# updatedb
# locate comments_it.txt
/var/lib/mysql/ІМ'Я_БАЗИ_ДАНИХ/comments_it.txt

Тобто файл буде збережено у каталозі БД. Також майте на увазі, що абсолютних шляхів команда INTO OUTFILE не розуміє.

Конвертація дампу бази даних MySQL з Latin1 у UTF8

Постала задача забезпечити підтримку юнікоду у базі даних. Після модифікації параметрів підключення до БД виявилось, що замість юнікоду зберігається якась абракадабра.

Хоча були додані стандартні параметри:

  • useUnicode=true
  • characterEncoding=utf8
  • characterSetResults=utf8
  • connectionCollation=utf8_general_ci

Уважно подивившись у код дампу БД я побачив, що для усіх таблиць використовується кодування latin1 замість utf8. Нижче ви можете побачити фрагмент дампу:

...
DROP TABLE IF EXISTS `autosave`;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `autosave` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `create_time` timestamp NOT NULL default CURRENT_TIMESTAMP
 on update CURRENT_TIMESTAMP,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;
...

Традиційний програміст почав би копати документацію MySQL на тему зміни кодування БД та окремих таблиць, але сьогодні я обрав тактику системного адміністратора: я вирішив замінити кодування прямо у дампі БД.

Отже спочатку я створюю дамп БД у файлі dump.sql:

$ mysqldump -u КОРИСТУВАЧ -p БД > dump.sql

Потім використовую команду sed для заміни всіх кодувань таблиць:

$ sed -i 's/DEFAULT CHARSET=latin1;/DEFAULT CHARSET=utf8;/' dump.sql

Якщо лячно одразу використовувати цей запит на реальному дампі, можете переглянути спочатку його результати (що саме він модифікує) такою командою:

$ sed -n 's/DEFAULT CHARSET=latin1;/DEFAULT CHARSET=utf8;/p' dump.sql
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
...

Тепер видаляємо стару БД, створюємо її знову, але вже з кодуванням UTF-8 за умовчанням:

$ mysql -u КОРИСТУВАЧ -p БД
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 36
Server version: 5.0.51a-24+lenny2 (Debian)
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> DROP DATABASE БД;
Query OK, 64 rows affected (0.20 sec)
mysql> CREATE DATABASE БД DEFAULT CHARSET utf8;
Query OK, 1 row affected (0.01 sec)
mysql> exit
Bye

І нарешті заливаю новий дамп:

$ mysql -u КОРИСТУВАЧ -p БД < dump.sql

Видалення тимчасових файлів CVS

Сьогодні оновлював багато файлів в одному проекті (він під контролем CVS) і помітив, що моя робоча копія має цілу купу зайвих тимчасових файлів. Їх імена починались на “.#”. Гадаю, що це копії більш ранніх версій одного файлу, тому що я часто переглядаю старі ревізії.
Саме просте рішення – видалити робочу копію, та зробити cvs checkout, але проект великий і мені не хотілося качати все з інтернету. Тому я поступив простіше. Спочатку переглянув ці файли, щоб ненароком не витерти щось корисне:

$ find . -type f -name ".#*"

А потім всі їх видалив:

$ find . -type f -name ".#*" -exec rm {} ;

Звичайно після цього перевірив чи все гаразд з робочою копією:

$ cvs update -dP

До речі, якщо Вам з робочої копії CVS треба видалити саме інформацію про систему контролю версій (директорії CVS), то це можна зробити наступною командою:

$ find . -type d -name "CVS" -exec rm -rf {} ;

Підсвічування синтаксису при передачі кода через e-mail, ICQ чи Skype

Якщо Вам треба показати комусь шмат коду, а ви спілкуєтесь через e-mail, ICQ чи skype, то у пригоді стане сервіс http://pastie.org/. Адже без підсвічування синтаксису в деяких мовах програмування досить важко розібратися.

Користуватись цим сервісом дуже просто. Копіюєте текст, обираєте для нього правильну мову для підсвічування синтаксису і короткий URL для передачі готов.

Наприклад, код Perl с попереднього повідомлення виглядає так:

http://pastie.org/1754095