When I started to work with WordPress I didn’t know anything about how databases works or anything related to encoding and character set, but as I started into adventure myself on places like `pre_get_posts`, and the `WP_Query` filters such as `posts_join` and `posts_where`, I quickly found that understanding how the database works was a key to unlocking better performance.

Once I was trying to do a search on some User meta data and I didn’t know why one of my results where not been shown as I expected so delving further and debugging I found that there an information called Collation which is the set of Rules that your database table will follow.

The problem was this meta data was a `city` value, and I did not have control over the user input so it needed to be case-insensitive, which was not happening because the Collation was set to be `utf8_bin` that will make your MySQL compare queries that involve `LIKE` via a Binary structure so it will `A` is not equal to `a`.

This case sensibility issue on WordPress databases or any MySQL is easy to solve, you just need to change the collation of the tables that you want to be insensitive by executing the following SQL query on your database.

“`sql
ALTER TABLE `wp_posts` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `wp_postmeta` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
“`

Where the `_ci` at the end will convert the Collation to be Case Insensitive, remember that changing the Collation of a table might lead you to have security problems of people trying to pose as Administrator account, which in WordPress is not the case because there are validations for that but if you are in another system you might want to double check.

Similar Posts

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.