I have a rails application running on production mode, but all of the sudden this error came up today when a user tried to save a record.
Mysql2::Error: Incorrect string value
More details (from production log):
Parameters: {"utf8"=>"â<9c><93>" ...
Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k
Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k
Now I saw some solutions that required dropping the databases and recreating it, but I cannot do that.
Now mysql shows this:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)
What is wrong and how can I change it so I do not have any problems with any characters?
Also: Is this problem solvable with javascript? Convert it before sending it ?
Thanks
If you want store emoji, you need:
1) Create a migration (thanks @mfazekas)
2) Change rails charset to utf8mb4 (thanks @selvamani-p)
References:
https://stackoverflow.com/a/39465494/1058096
https://stackoverflow.com/a/26273185/1058096
Also, if you don't want to do changes in your database structure, you could opt by serializing the field in question.
Need to change
CHARACTER SET
andCOLLATE
for already created database:Or it was necessary to create a database with pre-set parameters:
Just came upon this and appreciate @mfazekas's answer. I made two changes in the migration: one to accommodate the removal of from connection.current_database (at least in Rails 5) and the ability to skip the SQL statements if not using MySQL (I still use SQLite in development but need the migration to run).
You can use a migration like this to convert your tables to utf8:
I managed to store emojis (which take up 4 bytes) by following this blog post:
Then I had to restart my app and it worked. Please note that some emojis will work without this fix, while some won't: