Недавно столнулся с обыденной задачей. Необхимо было перенести сайт со старого сервера на новый. И на старом и на новом севрере был установлен MySQL версии 5.

После переноса на новый сервер сайт перестал работать. Проблема оказалась в том, что не работала одна из хранимых процедур. На новом сервере не была найдена встроенная функция PREG_REPLACE.

[taras@webhome ~]$ mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.83 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT TRIM(BOTH '-' FROM PREG_REPLACE('/[\\\\s-]+/', '-', PREG_REPLACE('/&[\\w#]+?;|[^\\w\\s-]+/', '', LOWER(" Test string & just for test!.. "))));
ERROR 1305 (42000): FUNCTION PREG_REPLACE does not exist

Посмотрев в поисковике я обнаружил, что это не стандрартная функция MySQL. Эта функция стандартна для PHP, а в MySQL есть UDF расширение lib_mysqludf_preg, которое выполняет аналогичные задачи.

Для установки этого расширения необходима библиотека PCRE: Perl-compatible regular expression library. Ее можно поставить через yum или из исходных текстов, как показано ниже:

[root@webhome install]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz
...
[root@webhome install]# tar -xzvf prcre-7.9.tar.gz
...
[root@webhome install]# cd pcre-7.9/
...
[root@webhome pcre-7.9]# ./configure
...
[root@webhome pcre-7.9]# make
...
[root@webhome pcre-7.9]# make install 

Установка самой библиотеки lib_mysqludf_preg из исходников выглядит так:

[root@webhome install]# wget http://mysqludf.com/lib_mysqludf_preg/lib_mysqludf_preg-0.7.0.tar.gz
...
[root@webhome install]# tar -xzvf lib_mysqludf_preg-0.7.0.tar.gz
...
[root@webhome install]# cd lib_mysqludf_preg-0.7.0
...
[root@webhome lib_mysqludf_preg-0.7.0]# ./configure
...
[root@webhome lib_mysqludf_preg-0.7.0]# make
...
[root@webhome lib_mysqludf_preg-0.7.0]# make install
...

Далее необходимо настроить MySQL. Для этого в секцию [mysqld] главного конфигурационного файла /etc/my.cnf установить значение переменной plugin_dir. В моем случае установленная библиотека lib_mysqludf_preg находится в /usr/local/lib.

После сохранения изменений в конфигурации необходимо перезапустить MySQL, например так:

[root@webhome lib_mysqludf_preg-0.7.0]# /etc/init.d/mysqld restart
Stopping MySQL:                                            [  OK  ]
Starting MySQL:                                            [  OK  ]

Теперь необходимо установить функцию PREG_REPLACE, для этого в клиенте mysql необходимо выполнить команду:

mysql> CREATE FUNCTION preg_replace RETURNS STRING SONAME 'lib_mysqludf_preg.so';
Query OK, 0 rows affected (0.08 sec)

Теперь установленную функцию можно использовать:

mysql> SELECT TRIM(BOTH '-' FROM PREG_REPLACE('/[\\s-]+/', '-', PREG_REPLACE('/&[\\w#]+?;|[^\\w\\s-]+/', '', LOWER(" Test string & just for test!.. "))));
+---------------------------------------------------------------------------------------------------------------------------------------------+
| TRIM(BOTH '-' FROM PREG_REPLACE('/[\\s-]+/', '-', PREG_REPLACE('/&[\\w#]+?;|[^\\w\\s-]+/', '', LOWER(" Test string & just for test!.. ")))) |
+---------------------------------------------------------------------------------------------------------------------------------------------+
| test-string just-for-test                                                                                                                   |
+---------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)