Недавно столнулся с обыденной задачей. Необхимо было перенести сайт со старого сервера на новый. И на старом и на новом севере был установлен 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#]+?;|[^ws-]+/', '', 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#]+?;|[^ws-]+/’, ’’, LOWER(» Test string & just for test!.. «))));
+---------------------------------------------------------------------------------------------------------------------------------------------+
| TRIM(BOTH ’-’ FROM PREG_REPLACE(’/[s-]+/’, ’-’, PREG_REPLACE(’/&[w#]+?;|[^ws-]+/’, ’’, LOWER(» Test string & just for test!.. «)))) |
+---------------------------------------------------------------------------------------------------------------------------------------------+
| test-string just-for-test |
+---------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)
UPD 27.05.2020: Если стоит mySQL 8+ или MariaDB, то эти UPD не нужны. https://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql/9456574
|