Wel, depending on whether you're validating (i.e. someone submits their name and you want th check if it's in the database or not) or doing something for each entry in a query (give me a list of every person in the database who likes cheeseburgers), you could just canonicalize in your query. Observe:
$sth=$dbh->prepare(qq(select * from table where lower(last_name)=?)) o
+r die "$dbh->errstr";
my ($new_last_name = $last_name) =~ tr/[A-Z]/[a-z]/;
$sth->execute($new_last_name) or die "$dbh->errstr";
Now, you can store the names on the database how ever you want, do your query, and return what the user actually entered in as their name (many have made the point that they know how to spell their own name). By translating both your string and what's on the database to lowercase, you are going to find the match regardless of what case it is on the database. Be warned though that this basically destroys any indexing that you may have had on that field, because the database doesn't know what the results of the lower() function will be until it actually does it. So, it must do it on every record on the table.