2012-04-24 12 views
6

SELECT title FROM tags WHERE title REGEXP '[\x20]'は、x、2、または0のすべてのものを返します。MYSQLの16進コードに基づいてREGEXP検索を行うにはどうすればよいですか?

私の実際のユースケースは、私は偶然に制御文字を得ている可能性のあるタグを検索したいということです文字通りX20と SELECT title FROM tags WHERE title REGEXP '\x20'戻ってすべてのものを。

+0

どの制御文字ですか? –

+0

本当に。私はそこに「正当な」キャラクターがほしいだけです。 –

答えて

3

これを行うには良い方法があるかもしれませんが、ここに私が思いついたものがあります:

SELECT title FROM tags WHERE title REGEXP CONCAT('[',CHAR(1),'-',CHAR(31),']') 

これらは10進数ではなく、16進数の値です。また、NULLバイト(\x00)も見つけ出す方法を見つけることができませんでした。ここで

は進リテラルを使用する代替です:

SELECT title FROM tags WHERE title REGEXP CONCAT('[', x'01', '-', x'1F', ']') 
+0

ええ、それは間違いなく00で爆発します。あなたの答えがどのように働くのか分かりません。引用符の外側にxを置き、CONCATを使用します。あなたはその答えを達成するために何をしているのか説明できますか? –

+1

MySQLが '\ x'エスケープをサポートしていれば、これは' '[\ x01- \ x1F]' 'という文字列を構成します。正規表現では、文字コードが1と1Fの間のすべての文字と一致する文字クラスになります。 'CONCAT'は文字列を連結するので、' CONCAT( 'hello'、 'world') 'は' helloworld 'になります。 16進リテラル[ここ](http://dev.mysql.com/doc/refman/5.0/en/charset-literal.html)を読むことができます。 –

+0

次のクエリで1つのXML文字を16進数で検索できます: 'SELECT title FROM tags WHERE title REGEXP x'01'' – rinogo

0

私はあなたが自分でバックスラッシュを削除mysqlのシェルでそれを行うと信じています。以下は私のために働いた:

select id, data regexp '\\x1F\\x8B\\x08' from ...; 
関連する問題