Q:

Why grep doesn't find when searching part of the word?

I have encountered several times the case when I want to search a part of the word, grep fails to find those matches. It works when I search full word.
For example, I need to find all files that contain "mysql_" word. Because I am dealing with legacy code that uses "mysql" instead of "mysqli" to work with a database, and want to see how much of the code uses "mysql".
Now, my command is 
grep -rnw './' -e "mysql_"

or
grep -P -rnw '\bmysql_' .

This still doesn't work.
But if I type:
grep -rnw './' -e "mysql_query"

then of course, grep finds all matches.
What am I doing wrong?

A:

Because you are using the '-w' parameter which means that your search pattern should occur as a full word (in other words, is delimited "non-word" characters):

  -w, --word-regexp
          Select only those lines containing matches that form  whole  words.   The
          test  is  that  the matching substring must either be at the beginning of
          the line, or preceded by a non-word constituent character.  Similarly, it
          must  be  either  at  the  end  of  the  line  or  followed by a non-word
          constituent character.  Word-constituent characters are letters,  digits,
          and the underscore.

Note that in a regex, an underscore is a "word" character.. 
Since mysql_ only appears as part as a word (as in mysql_query), grep -w doesn't report it.

