Matt,

Yes, database could be cleaned with a query, but I don't even want to think
about the code problem.  I was being hyperbolic with the "500,000"; it's
actually more like 50,000 lines of code - but still, who wants to change
50,000 lines of code.  And yes, it's PHP.

However, as an update, I did some tests on another installation of the
software we have on a different server, and it was actually matching the
"\".  The "problem" server will match with something like "... WHERE Field
REGEXP 'somebody.?'s'" so mysql knows there's a character there, it just
won't allow you to escape the "\" to be able to use it.  I'm going to do a
configuration comparison for both php and mysql between the two boxes and
try to hunt down the problem.

-----Original Message-----
From: Matt W [mailto:[EMAIL PROTECTED]
Sent: Saturday, November 15, 2003 3:20 PM
To: Jason Ramsey; [EMAIL PROTECTED]
Subject: Re: Backslash and full text searches


Hi Jason,

Sorry for the late reply.

If all of the 100,000 entries have extra backslashes, that can be fixed
with a query. But then you have all your code. :-(

Speaking of code, what language are you using? I always assume PHP, but
with 500k lines I'm thinking you're using C?

Is somebody\'s the only word you're trying to match? I just tried it and
I can't get somebody\'s to match even as a phrase in BOOLEAN mode
because the "somebody" part is a stopword. However, Matt\'s works. If
you can't match a non-stopword, are you sure the correct amount of
backslashes are making it to MySQL, or are they being lost as escape
characters in your programming language first?

My results:

mysql> CREATE TABLE test (test TEXT NOT NULL, FULLTEXT (test));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test VALUES ('This is Matt\\\'s text.'), ('Text by
Matt.');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test;
+-----------------------+
| test                  |
+-----------------------+
| This is Matt\'s text. |
| Text by Matt.         |
+-----------------------+
2 rows in set (0.00 sec)

mysql> -- This just matches the Matt part
mysql> SELECT * FROM test WHERE MATCH (test) AGAINST('Matt\\\'s' IN
BOOLEAN MODE);
+-----------------------+
| test                  |
+-----------------------+
| This is Matt\'s text. |
| Text by Matt.         |
+-----------------------+
2 rows in set (0.00 sec)

mysql> -- Exact phrase
mysql> SELECT * FROM test WHERE MATCH (test) AGAINST(' "Matt\\\'s" ' IN
BOOLEAN MODE);
+-----------------------+
| test                  |
+-----------------------+
| This is Matt\'s text. |
+-----------------------+
1 row in set (0.00 sec)


Matt


----- Original Message -----
From: "Jason Ramsey"
Sent: Thursday, November 13, 2003 6:41 PM
Subject: RE: Backslash and full text searches


> Thanks for your answer, you can see my comments below.
>
> -----Original Message-----
> From: Matt W
> Sent: Thursday, November 13, 2003 3:36 PM
> To: Jason Ramsey; [EMAIL PROTECTED]
> Subject: Re: Backslash and full text searches
>
>
> Hi Jason,
>
> Of course somebody's isn't going to match somebody\'s. :-) somebody\'s
> should match somebody\'s -- because it's really matching the
"somebody"
> part.
>
> ^ That makes sense to me, and the behavior I would have expected;
except, it
> doesn't seem to work that way.  Anything I try I can't get
"somebody\'s" to
> match a field in the database.
>
> If you're using 4+, you can use IN BOOLEAN MODE to match
> somebody\'s exactly:
>
> MATCH (col) AGAINST (' "somebody\\\'s" ' IN BOOLEAN MODE)
>
> ^ Unfortunatley, this doesn't work.  I've tried several variations,
but
> can't seem to match useing MATCH, LIKE or even "=".
>
> However, I get the feeling that you're not really wanting to match a
> word that has a backslash in it. e.g. You're getting extra
backslashes.
> mysql_escape_string()/addslashes() *DOES NOT* store the backslashes in
> the table -- it's not even *possible* since they're only escape
> characters in the query. If you're getting any extra backslashes when
> retrieving data, too many were added during insertion -- you ran
> mysql_escape_string/addslashes too many times. This happens if PHP's
> stupid magic_quotes_gpc is on and you don't check for that.
>
> ^hmm.  Well, that certainly is different than what I understood, and
helpful
> information.  It looks like magic_quotes_gpc is on.  However, now I
have a
> problem that we have a 100,000 entries in the database like this, and
> 500,000 lines of code expecting the backslash.  I really need to find
a
> solution so that I can search and somehow account for the "\" in my
> searches.  Any help would be appreciated.
>
>
> Your text should come out exactly the way it was intended. Never, ever
> any need for stripslashes(), etc. if it was inserted correctly. :-)
>
>
> Hope that helps.
>
>
> Matt
>
>
>
> ----- Original Message -----
> From: "Jason Ramsey"
> Sent: Thursday, November 13, 2003 4:10 PM
> Subject: Backslash and full text searches
>
>
> > We make extensive use of full text searches, but have run into some
> problems
> > with backslashes.  If a word like "somebody's" is entered into our
> database,
> > we escape the string using "mysql_escapes_string" in php.  So,
> > mysql_escape_string("somebody's") becomes "somebody\'s" when it is
> saved in
> > the database.  The problem is, we don't seem to be able to match
> against
> > this in the database.
> >
> > Let's say we saved "somebody's" in the data base.  The following
will
> match
> > fine and pull up the results expected...
> >
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ("somebody's")
> >
> > ... But if "somebody\'s" is stored in the database, there seems to
be
> no way
> > to match the "\".  We've tried all of the following...
> >
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ("somebody's")
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ('somebody's')
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ('"somebody's"')
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ("somebody\'s")
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ('somebody\'s')
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ("somebody\\\'s")
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ('somebody\\\'s')
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ('"somebody\'s"')
> > SELECT * FROM Table WHERE MATCH (Field) AGAINST ('"somebody\\\'s"')
> >
> > ... Any ideas?


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to