MySqlでREGEXPを使うときの特殊文字のエスケープの仕方の質問です。
仮に以下のようなファイルがあって、これをgrepしたら、バックスラッシュで特殊文字のエスケープが出来ます。
txt
1~$ cat regex.txt 2 3 This line ends with a dot. 4 [text] kaku kakko 5 {text} nami kakko 6 my ip is 192.168.1.99 7 slash / backslash \
grep
1 ~$ cat regex.txt | grep '\.' 2This line ends with a dot. 3my ip is 192.168.1.99 4 5~$ cat regex.txt | grep -e '\[' 6[text] kaku kakko 7 8~$ cat regex.txt | grep -e '\{' 9{text} nami kakko 10 11~$ cat regex.txt | grep -e '\\' 12slash / backslash \
同様のことをMYSQLでやりたいのですが、エラーになります。テーブル・データはすであるものとします。その既存のテーブルデータはこの通り。
mysql
1mysql> SELECT * from mytable; 2+-----+-----------------------------------------+ 3| 1 | This line ends with a dot. | 4| 2 | [text] kaku kakko | 5| 3 | {text} nami kakko | 6| 4 | my ip is 192.168.1.99 | 7| 5 | slash / backslash \ | 8+---+-------------------------------------------+
さて、上のテーブルを使って、以下のエラーが出るので、どう修正すればよいのかを教えてください。
mysql > SELECT * from mytable WHERE REGEXP '\.' ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use near 'regexp '\.' mysql > SELECT * from mytable WHERE REGEXP '\[' ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use near 'regexp '\['
REGEXPで特殊文字をエスケープする方法を教えてください。もしかすると、エスケープ以外、他に何か問題があるのでしょうか?
追記:
回答をよんでみて、質問が明確ではないと感じたので追記いたします。
テーブルはすでに作られていて、テキストもすでにインサートされているものとします。テーブルの作り方、インサートの仕方の質問ではありません。 REGEXPのエラーに関する質問です。
当たり前の話ですが、まずmysqlのマニュアルを調べてください。
create table Test(id integer, value varchar(100));
insert into Test(id, value) values(1, 'This line ends with a dot.');
insert into Test(id, value) values(2, '[text] kaku kakko');
insert into Test(id, value) values(3, '{text} nami kakko');
insert into Test(id, value) values(4, 'my ip is 192.168.1.99');
insert into Test(id, value) values(5, 'slash / backslash \\');
select * from Test;
select * from Test where value regexp '\\.';
select * from Test where value regexp '\\[';
select * from Test where value regexp '\\{';
select * from Test where value regexp '\\[';
select * from Test where value regexp '\\\\';
はて・・・一体どんな環境を使用してるんでしょうね?MySQLならこうなると思うんだけどw
select version();
select 0x5c;
https://paiza.io/projects/VNAw_zyJeYUWKyXXm8z-3g?locale=ja-jp
https://onecompiler.com/mysql/3ysaksudw
onlineだけでなくlocalの最新でも確認したw
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.31 |
+-----------+
1 row in set (0.00 sec)
mysql> create table Test(id integer, value varchar(100));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into Test(id, value) values(1, 'This line ends with a dot.');
Query OK, 1 row affected (0.01 sec)
mysql> insert into Test(id, value) values(2, '[text] kaku kakko');
Query OK, 1 row affected (0.01 sec)
mysql> insert into Test(id, value) values(3, '{text} nami kakko');
Query OK, 1 row affected (0.01 sec)
mysql> insert into Test(id, value) values(4, 'my ip is 192.168.1.99');
Query OK, 1 row affected (0.00 sec)
mysql> insert into Test(id, value) values(5, 'slash / backslash \\');
Query OK, 1 row affected (0.00 sec)
mysql> select * from Test;
+------+----------------------------+
| id | value |
+------+----------------------------+
| 1 | This line ends with a dot. |
| 2 | [text] kaku kakko |
| 3 | {text} nami kakko |
| 4 | my ip is 192.168.1.99 |
| 5 | slash / backslash \ |
+------+----------------------------+
5 rows in set (0.01 sec)
mysql> select * from Test where value regexp '\\.';
+------+----------------------------+
| id | value |
+------+----------------------------+
| 1 | This line ends with a dot. |
| 4 | my ip is 192.168.1.99 |
+------+----------------------------+
2 rows in set (0.00 sec)
mysql> select * from Test where value regexp '\\[';
+------+-------------------+
| id | value |
+------+-------------------+
| 2 | [text] kaku kakko |
+------+-------------------+
1 row in set (0.00 sec)
mysql> select * from Test where value regexp '\\{';
+------+-------------------+
| id | value |
+------+-------------------+
| 3 | {text} nami kakko |
+------+-------------------+
1 row in set (0.00 sec)
mysql> select * from Test where value regexp '\\[';
+------+-------------------+
| id | value |
+------+-------------------+
| 2 | [text] kaku kakko |
+------+-------------------+
1 row in set (0.00 sec)
mysql> select * from Test where value regexp '\\\\';
+------+---------------------+
| id | value |
+------+---------------------+
| 5 | slash / backslash \ |
+------+---------------------+
1 row in set (0.00 sec)
mysql>
詳しい説明ありがとうございます。 私の問題は、... WHERE *列の名前* REGEX ... の*列の名前*を忘れていたことが問題でした。
いろいろ、ありがとうございます。
回答1件
あなたの回答
tips
プレビュー