How to convert my table from latin1_swedish_ci to utf8 [duplicate] - php

How can I convert entire MySQL database character-set to UTF-8 and collation to UTF-8?

Use the ALTER DATABASE and ALTER TABLE commands.
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Or if you're still on MySQL 5.5.2 or older which didn't support 4-byte UTF-8, use utf8 instead of utf8mb4:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Make a backup!
Then you need to set the default char sets on the database. This does not convert existing tables, it only sets the default for newly created tables.
ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
Then, you will need to convert the char set on all existing tables and their columns. This assumes that your current data is actually in the current char set. If your columns are set to one char set but your data is really stored in another then you will need to check the MySQL manual on how to handle this.
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

On the commandline shell
If you're one the commandline shell, you can do this very quickly. Just fill in "dbname" :D
DB="dbname"
(
echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
| xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"
One-liner for simple copy/paste
DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

You can create the sql to update all tables with:
SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci; ",
"ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ")
AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = "your_database_name";
Capture the output and run it.
Arnold Daniels' answer above is more elegant.

Before proceeding, ensure that you: Have completed a full database backup!
Step 1: Database Level Changes
Identifying the Collation and Character set of your database
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM
information_schema.SCHEMATA S
WHERE schema_name = 'your_database_name'
AND
(DEFAULT_CHARACTER_SET_NAME != 'utf8'
OR
DEFAULT_COLLATION_NAME not like 'utf8%');
Fixing the collation for the database
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Step 2: Table Level Changes
Identifying Database Tables with the incorrect character set or collation
SELECT CONCAT(
'ALTER TABLE ', table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci; ',
'ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'your_database_name'
AND
(C.CHARACTER_SET_NAME != 'utf8'
OR
C.COLLATION_NAME not like 'utf8%')
Adjusting table columns' collation and character set
Capture upper sql output and run it. (like following)
ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
refer to: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database

Use HeidiSQL. Its free and a very good db tool.
From tools menu, enter Bulk table editor
Select the complete database or pick tables to convert,
tick Change default collation: utf8mb4_general_ci
tick Convert to charset: utf8
Execute
This converts complete database from latin to utf8 in just a few seconds.
Works like a charm :)
HeidiSQL connects by default as utf8 so any special characters should now be seen as the character (Γ¦ ΓΈ Γ₯) and not as encoded when inspecting the table data.
The real pitfall when moving from latin to utf8 is to make sure pdo connects with utf8 charset. If not you will get rubbish data inserted to the utf8 table and question marks all over the place on your web page, making you think the table data is not utf8...

DELIMITER $$
CREATE PROCEDURE `databasename`.`update_char_set`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE t_sql VARCHAR(256);
DECLARE tableName VARCHAR(128);
DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN lists;
FETCH lists INTO tableName;
REPEAT
SET #t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');
PREPARE stmt FROM #t_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
FETCH lists INTO tableName;
UNTIL done END REPEAT;
CLOSE lists;
END$$
DELIMITER ;
CALL databasename.update_char_set();

Inspired by #sdfor comment, here is a bash script that does the job
#!/bin/bash
printf "### Converting MySQL character set ###\n\n"
printf "Enter the encoding you want to set: "
read -r CHARSET
# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME
# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD
DBLIST=( mydatabase1 mydatabase2 )
printf "\n"
for DB in "${DBLIST[#]}"
do
(
echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
| xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"
echo "$DB database done..."
done
echo "### DONE ###"
exit

In case the data is not in the same character set you might consider this snippet from http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html
If the column has a nonbinary data type (CHAR, VARCHAR, TEXT), its
contents should be encoded in the column character set, not some other
character set. If the contents are encoded in a different character
set, you can convert the column to use a binary data type first, and
then to a nonbinary column with the desired character set.
Here is an example:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;
Make sure to choose the right collation, or you might get unique key conflicts. e.g.
Γ‰leanore and Eleanore might be considered the same in some collations.
Aside:
I had a situation where certain characters "broke" in emails even though they were stored as UTF-8 in the database. If you are sending emails using utf8 data, you might want to also convert your emails to send in UTF8.
In PHPMailer, just update this line: public $CharSet = 'utf-8';

For databases that have a high number of tables you can use a simple php script to update the charset of the database and all of the tables using the following:
$conn = mysqli_connect($host, $username, $password, $database);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);
$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables = mysqli_fetch_all($show_tables_result);
foreach ($tables as $index => $table) {
$alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci";
$alter_table_result = mysqli_query($conn, $alter_table_sql);
echo "<pre>";
var_dump($alter_table_result);
echo "</pre>";
}

The safest way is to modify the columns first to a binary type and then modify it back to it type using the desired charset.
Each column type have its respective binary type, as follows:
CHAR => BINARY
TEXT => BLOB
TINYTEXT => TINYBLOB
MEDIUMTEXT => MEDIUMBLOB
LONGTEXT => LONGBLOB
VARCHAR => VARBINARY
Eg.:
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;
I tried in several latin1 tables and it kept all the diacritics.
You can extract this query for all columns doing this:
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');
After you do this on all your columns then you do it on all tables:
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
To generate this query for all your table, use the following query:
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');
And now that you modified all your columns and tables, do the same on the database:
ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql
:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq
mysql -uusername -ppassword < dump-fixed.sql

from utf8 to utf8mb4:
1.show all DATABASE default characterset:
SELECT SCHEMA_NAME 'YOUR_DATABASE_NAME',
default_character_set_name 'charset',
DEFAULT_COLLATION_NAME 'collation'
FROM information_schema.SCHEMATA;
2.show all tables status(character set), focus on column 'collation':
use YOUR_DATABASE_NAME;
SHOW TABLE STATUS ;
3.generate convert sql:
convert database & all tables to utf8mb4,utf8mb4_unicode_ci
USE information_schema;
SELECT CONCAT("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") AS _sql
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema UNION
SELECT CONCAT("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS _sql
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema, TABLE_NAME
/*include all columns, commonly don't need this.*/
/*
UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('varchar','char') AND TABLE_TYPE='BASE TABLE' UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('text','tinytext','mediumtext','longtext') AND TABLE_TYPE='BASE TABLE';
*/
4.run the sql generated.
5.refresh your database.
6.check:
SHOW TABLE STATUS ;

If you cannot get your tables to convert or your table is always set to some non-utf8 character set, but you want utf8, your best bet might be to wipe it out and start over again and explicitly specify:
create database database_name character set utf8;

To change the character set encoding to UTF-8 for the database itself, type the following command at the mysql> prompt. Replace DBNAME with the database name:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

The only solution that worked for me: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8
Converting a database containing tables
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql
:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq
mysql -uusername -ppassword < dump-fixed.sql

alter table table_name charset = 'utf8';
This is a simple query i was able to use for my case, you can change the table_name as per your requirement(s).

You can also DB tool Navicat, which does it more easier.
Siva.
Right Click Your Database & select DB Properties & Change as you desired in Drop Down

Command Line Solution and Exclude Views
I am simply completing #Jasny's answer for others like #Brian and I who have views in our database.
If you have an error like this:
ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'
It's because you probably have views and you need to exclude them.
But when trying to exclude them, MySQL returns 2 columns instead of 1.
SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1 BASE TABLE
-- table_name2 BASE TABLE
So we have to adapt Jasny's command with awk to extract only the 1st column which contains the table name.
DB="dbname"
(
echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
| awk '{print $1 }' \
| xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"
One-liner for simple copy/paste
DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

To change the character set encoding to UTF-8 follow simple steps in PHPMyAdmin
Select your Database
Go To Operations
In operations tab, on the bottom collation drop down menu, select you desire encoding i.e(utf8_general_ci), and also check the checkbox (1)change all table collations, (2) Change all tables columns collations. and hit Go.

Related

Not able to insert πŸ‘ŒπŸ» into comments in WordPress [duplicate]

I have a MySQL database configured with the default collation utf8mb4_general_ci. When I try to insert a row containing an emoji character in the text using the following query
insert into tablename
(column1,column2,column3,column4,column5,column6,column7)
values
('273','3','HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29');
MySQL is raising the following error
1366 Incorrect string value: '\xF0\x9F\x98\x83\xF0\x9F...' for column
'comment' at row 1
1) Database: Change Database default collation as utf8mb4.
2) Table: Change table collation as CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.
Query:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Code:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')
4) Set utf8mb4 in database connection:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');
Step 1, change your database's default charset:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
if the db is not created yet, create it with correct encodings:
CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;
Step 2, set charset when creating table:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or alter table
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;
The command to modify the column is:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
And we need to use type = BLOB
Example to modify is as under:-
ALTER TABLE messages MODIFY content BLOB;
I checked that latest mySQL and other databases don't need '' to use in command on table_name, column_name etc.
Fetch and Save data:
Directly save the chat content to column and to retrieve data, fetch data as byte array (byte[]) from db column and then convert it to string e.g. (Java code)
new String((byte[]) arr)
Both the databases and tables should have character set utf8mb4 and collation utf8mb4_unicode_ci.
When creating a new database you should use:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
If you have an existing database and you want to add support:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
You also need to set the correct character set and collation for your tables:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or change it if you've got existing tables with a lot of data:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Note that utf8_general_ci is no longer recommended best practice. See the related Q & A:
What's the difference between utf8_general_ci and utf8_unicode_ci on Stack Overflow.
If you are using Solr + Mysql + Java, you can use:
This can be Used :
case1: When you don`t want to alter DB.
case2: when you have to import emoticons from your Mysql to Solr core.
In above case this is one of the solutions to store your emoticons in your system.
Steps to use it:
Library used: import java.net.URLDecoder;
import java.net.URLEncoder;
Use urlEncoder to encode your String having emoticons.
Store it in DB without altering the MysqlDB.
You can store it in solr core(decoded form)if you want or you can store
encoded form.
When fetching these emoticons from DB or Solr core you can now decode it
Using urlDecoder.
Code example:
import java.net.URLDecoder;
import java.net.URLEncoder;
public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("πŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡³πŸ‡―πŸ‡΅πŸ‡©πŸ‡ͺπŸ”³πŸ”ΊπŸ†”πŸ†”πŸ†‘3⃣5⃣3βƒ£β€Όγ€½βž—βž—πŸŽ¦πŸ”†πŸŽ¦πŸ”†β™‹β™β™‹β™β¬…β¬†β¬…β¬…πŸ›‚πŸšΉπŸ›‚πŸ›„πŸš³πŸš¬πŸ’ŠπŸ”§πŸ’ŠπŸ—Ώ "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}
public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
I have updated my database and table to upgraded from utf8 to utf8mb4. But nothing works for me. Then I tried to update column datatype to blob, luckily it worked for me and data has been saved. Even my database and table both are CHARACTER SET utf8 COLLATE utf8_unicode
My answer only adds to Selvamani P answer.
You might also need to change any SET NAMES utf8 queries with SET NAMES utf8mb4. That did the trick for me.
Also, this is a great article to port your website from utf8 to utf8mb4. In particular the article makes 2 good points on indexes and repairing tables after converting them to utf8mb4:
INDEXES
When converting from utf8 to utf8mb4, the maximum length of a column
or index key is unchanged in terms of bytes. Therefore, it is smaller
in terms of characters, because the maximum length of a character is
now four bytes instead of three. [...] The InnoDB storage engine has a maximum index length of 767 bytes, so for utf8 or utf8mb4 columns, you can index a maximum of 255 or 191 characters, respectively. If you currently have utf8 columns with indexes longer than 191 characters, you will need to index a smaller number of characters when using utf8mb4.
REPAIRING TABLES
After upgrading the MySQL server and making the necessary changes
explained above, make sure to repair and optimize all databases and
tables. I didn’t do this right away after upgrading (I didn’t think it
was necessary, as everything seemed to work fine at first glance), and
ran into some weird bugs where UPDATE statements didn’t have any
effect, even though no errors were thrown.
Read more about the queries to repair tables on the article.
I have a good solution to save your time. I also meet the same problem but I could not solve this problem by the first answer.
Your defualt character is utf-8. But emoji needs utf8mb4 to support it.
If you have the permission to revise the configure file of mysql, you can follow this step.
Therefore, do this following step to upgrade your character set ( from utf-8 to utf8mb4).
step 1. open your my.cnf for mysql, add these following lines to your my.cnf.
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
step2. stop your mysql service, and start mysql service
mysql.server stop
mysql.server start
Finished!
Then you can check your character are changed into utf8mb4.
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/Cellar/mysql#5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)
Well, you need not to change the Whole DB Charset. Instead of that you can do it by changing column to blob type.
ALTER TABLE messages MODIFY content BLOB;
There are two ways-->
# Way one
The simplest is to follow below steps:
Step 1:
SET NAMES utf8mb4;
Step 2:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Step 3:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Step 4:
ALTER TABLE table_name CHANGE column column VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
That's all!!
#Way Two (For Python)
This is a hack and its work like a charm
Step 1:
Encode your string and decode it in ASCII, and save it to your database.
content = 'πŸ₯³πŸ₯³ Content to be save in πŸ₯³πŸ₯³ Database πŸ₯³πŸ₯³'
encoded_content = content.encode('unicode-escape').decode('ASCII'))
This simply store encoded_content string in DB
Step 2:
While fetch this column data to show your user, simply convert it,
here content is the data, fetched from the database.
c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')
Done!!
Emoji support for application having tech stack - mysql, java, springboot, hibernate
Apply below changes in mysql for unicode support.
ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
DB Connection - jdbc url change:
jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8
Note - If the above step is not working please update mysql-connector version to 8.0.15. (mysql 5.7 works with connector version 8.0.15 for unicode support)
The main point hasn't been mentioned in the above answers that,
We need to pass query string with the options "useUnicode=yes" and "characterEncoding=UTF-8" in connection string
Something like this
mysql://USERNAME:PASSWORD#HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
The simplest solution what works for me is to store the data as json_encode.
later when you retrieve just make sure you json_decode it.
Here you don't have to change the collation or the character set of the database and the table.
For Rails, next to the accepted answer, don't forget to add:
encoding: utf8mb4
collation: utf8mb4_bin
to your database.yml
For anyone trying to solve this on a managed MySQL instance (in my case on AWS RDS), the easiest way was to modify the parameter group and set the server character set and collation to be utf8mb4 and utf8mb4_bin, respectively. After rebooting the server, a quick query verifies the settings for system databases and any newly created ones:
SELECT * FROM information_schema.SCHEMATA S;
If you are inserting using PHP, and you have followed the various ALTER database and ALTER table options above, make sure your php connection's charset is utf8mb4.
Example of connection string:
$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc
Notice the "charset" is utf8mb4, not just utf8!
Today I am facing the same question, but solutions in other answers don't work for me. Here is my solution.
First of all, changing charset in mysql/my.ini, database, and the table is necessary, as described in other answers.
Second, if you have created your tables before you want to saving emoji, you can use
SHOW FULL COLUMNS FROM `yourcolumn`;
To check whether the column you want to save emoji is set in utf8mb4. You can find that most of your columns are still in utf8 charset.
Use
ALTER TABLE `yourtable` CHANGE `yourcolumn` `yourcolumn` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
I'm facing this issue when upgrading MySQL 5.0 to MySQL 8.0 AWS RDS, trying many things finally what works for me share with you folks.
Error:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error:
3988 Conversion from collation utf8_unicode_ci into utf8mb4_general_ci
impossible for parameter in /var/www/html/pdo_con.php on line 87
Array (
[0] => HY000
[1] => 3988
[2] => Conversion from collation utf8_unicode_ci into utf8mb4_general_ci impossible for parameter )
Backend: PHP5/php7 + PDO is giving trouble.
Solution: only two thing needs to do
Add a code in line after your pdo connection
$conn->exec("set names utf8mb4");
where $conn is connection handler in PDO
Alter the table and set charset utf8mb4 and collate utf8mb4_unicode_ci.
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
This command will change your every column charset to utf8mb4 and collation too.
Put this right before your database call:
mysqli_set_charset($db, "utf8mb4");
This will allow you to input emojis directly into the database table that has been set to Collation: utfmb4_bin. Make sure to set your column to utfmb4 as well.
Hi my friends
This is how I solved this problem and I was happy to teach it to you as well
I am in the Android application
I encrypt a string containing text and emoj and send it to the server and save it in the mysql table and after receiving it from the server I decrypt it and display it in the textview.
encoded and decoded my message before request and after response:
I send Android app messages to mysql via pdo through this method and receive them with pdo. And I have no problem.
I think it was a good way. Please like
Thankful
public void main()
{
String message="hi mester ali moradi 🌦️🌦️ how are you ?";
String encoded_message=encodeStringUrl(message);
String decode_message=decodeStringUrl(encoded_message);
}
public static String encodeStringUrl(String message) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String message) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
message : hi mester ali moradi 🌦️🌦️ how are you ?
encoded : ghgh%F0%9F%98%AE%F0%9F%A4%90%F0%9F%98%A5
decoded :hi mester ali moradi 🌦️🌦️ how are you ?
If you use command line interface for inserting sql file to database.
Be sure your table charset utf8mb4 and column collation utf8mb4_unicode_ci or utf8mb4_bin
mysql -u root -p123456 my_database < profiles.sql
ERROR 1366 (HY000) at line 1679: Incorrect string value: '\xF0\x9F\x98\x87\xF0\x9F...' for column 'note' at row 328
we can solve the problem with this parameter
--default-character-set=name (Set the default character set)
mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql
Actually i'm using mysql Ver 8.0.23
I had created the both Database and the Table, without Altering them :
mysql> CREATE DATABASE tp2;
Query OK, 1 row affected (0.30 sec)
mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '🀣 oh my god');
Then after select, i thing it just worked fine !
I don't know if it is requested to enter Emoji as a hexadecimal or other encoding string or just copy it as it is... just correct me if i'm wrong, thank you !
I tried different methods and approaches and found a way that worked for me.
The SQL for the update query:
ALTER DATABASE YOUR_DB_NAME_HERE CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_unicode_ci;
You can see in the table, the emoji's are present
And if you go to this page: https://www.thecookingcat.com/recipes/thai-green-curry.php#comments
You can see the emojis in the comments.
I also have an RSS feed on the site and the emojis are included in the RSS feed XML code.
If anyone searching this in 2022 just follow these steps and no need to do any modification on Database
Name Space
using System.Web;
Your normal text like this :
String encode = "thank you 😊"
encode = HttpUtility.UrlEncode(encode);
It will store in Database like this : "thank+you+%f0%9f%98%8a"
And next fetch that data form your Database and do UrlDecode like this
DataSet ds = "Fetch your Encoded data form your Database";
String decode = HttpUtility.UrlDecode(ds.Tables[0].Rows[i]["YourColumnName"].ToString().Trim());
And your output is :-
decode = "thank you 😊".
It is working fine for me and saved time.

😍 into mysql database not working [duplicate]

I have a MySQL database configured with the default collation utf8mb4_general_ci. When I try to insert a row containing an emoji character in the text using the following query
insert into tablename
(column1,column2,column3,column4,column5,column6,column7)
values
('273','3','HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29');
MySQL is raising the following error
1366 Incorrect string value: '\xF0\x9F\x98\x83\xF0\x9F...' for column
'comment' at row 1
1) Database: Change Database default collation as utf8mb4.
2) Table: Change table collation as CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.
Query:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Code:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')
4) Set utf8mb4 in database connection:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');
Step 1, change your database's default charset:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
if the db is not created yet, create it with correct encodings:
CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;
Step 2, set charset when creating table:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or alter table
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;
The command to modify the column is:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
And we need to use type = BLOB
Example to modify is as under:-
ALTER TABLE messages MODIFY content BLOB;
I checked that latest mySQL and other databases don't need '' to use in command on table_name, column_name etc.
Fetch and Save data:
Directly save the chat content to column and to retrieve data, fetch data as byte array (byte[]) from db column and then convert it to string e.g. (Java code)
new String((byte[]) arr)
Both the databases and tables should have character set utf8mb4 and collation utf8mb4_unicode_ci.
When creating a new database you should use:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
If you have an existing database and you want to add support:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
You also need to set the correct character set and collation for your tables:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or change it if you've got existing tables with a lot of data:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Note that utf8_general_ci is no longer recommended best practice. See the related Q & A:
What's the difference between utf8_general_ci and utf8_unicode_ci on Stack Overflow.
If you are using Solr + Mysql + Java, you can use:
This can be Used :
case1: When you don`t want to alter DB.
case2: when you have to import emoticons from your Mysql to Solr core.
In above case this is one of the solutions to store your emoticons in your system.
Steps to use it:
Library used: import java.net.URLDecoder;
import java.net.URLEncoder;
Use urlEncoder to encode your String having emoticons.
Store it in DB without altering the MysqlDB.
You can store it in solr core(decoded form)if you want or you can store
encoded form.
When fetching these emoticons from DB or Solr core you can now decode it
Using urlDecoder.
Code example:
import java.net.URLDecoder;
import java.net.URLEncoder;
public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("πŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡³πŸ‡―πŸ‡΅πŸ‡©πŸ‡ͺπŸ”³πŸ”ΊπŸ†”πŸ†”πŸ†‘3⃣5⃣3βƒ£β€Όγ€½βž—βž—πŸŽ¦πŸ”†πŸŽ¦πŸ”†β™‹β™β™‹β™β¬…β¬†β¬…β¬…πŸ›‚πŸšΉπŸ›‚πŸ›„πŸš³πŸš¬πŸ’ŠπŸ”§πŸ’ŠπŸ—Ώ "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}
public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
I have updated my database and table to upgraded from utf8 to utf8mb4. But nothing works for me. Then I tried to update column datatype to blob, luckily it worked for me and data has been saved. Even my database and table both are CHARACTER SET utf8 COLLATE utf8_unicode
My answer only adds to Selvamani P answer.
You might also need to change any SET NAMES utf8 queries with SET NAMES utf8mb4. That did the trick for me.
Also, this is a great article to port your website from utf8 to utf8mb4. In particular the article makes 2 good points on indexes and repairing tables after converting them to utf8mb4:
INDEXES
When converting from utf8 to utf8mb4, the maximum length of a column
or index key is unchanged in terms of bytes. Therefore, it is smaller
in terms of characters, because the maximum length of a character is
now four bytes instead of three. [...] The InnoDB storage engine has a maximum index length of 767 bytes, so for utf8 or utf8mb4 columns, you can index a maximum of 255 or 191 characters, respectively. If you currently have utf8 columns with indexes longer than 191 characters, you will need to index a smaller number of characters when using utf8mb4.
REPAIRING TABLES
After upgrading the MySQL server and making the necessary changes
explained above, make sure to repair and optimize all databases and
tables. I didn’t do this right away after upgrading (I didn’t think it
was necessary, as everything seemed to work fine at first glance), and
ran into some weird bugs where UPDATE statements didn’t have any
effect, even though no errors were thrown.
Read more about the queries to repair tables on the article.
I have a good solution to save your time. I also meet the same problem but I could not solve this problem by the first answer.
Your defualt character is utf-8. But emoji needs utf8mb4 to support it.
If you have the permission to revise the configure file of mysql, you can follow this step.
Therefore, do this following step to upgrade your character set ( from utf-8 to utf8mb4).
step 1. open your my.cnf for mysql, add these following lines to your my.cnf.
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
step2. stop your mysql service, and start mysql service
mysql.server stop
mysql.server start
Finished!
Then you can check your character are changed into utf8mb4.
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/Cellar/mysql#5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)
Well, you need not to change the Whole DB Charset. Instead of that you can do it by changing column to blob type.
ALTER TABLE messages MODIFY content BLOB;
There are two ways-->
# Way one
The simplest is to follow below steps:
Step 1:
SET NAMES utf8mb4;
Step 2:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Step 3:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Step 4:
ALTER TABLE table_name CHANGE column column VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
That's all!!
#Way Two (For Python)
This is a hack and its work like a charm
Step 1:
Encode your string and decode it in ASCII, and save it to your database.
content = 'πŸ₯³πŸ₯³ Content to be save in πŸ₯³πŸ₯³ Database πŸ₯³πŸ₯³'
encoded_content = content.encode('unicode-escape').decode('ASCII'))
This simply store encoded_content string in DB
Step 2:
While fetch this column data to show your user, simply convert it,
here content is the data, fetched from the database.
c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')
Done!!
Emoji support for application having tech stack - mysql, java, springboot, hibernate
Apply below changes in mysql for unicode support.
ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
DB Connection - jdbc url change:
jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8
Note - If the above step is not working please update mysql-connector version to 8.0.15. (mysql 5.7 works with connector version 8.0.15 for unicode support)
The main point hasn't been mentioned in the above answers that,
We need to pass query string with the options "useUnicode=yes" and "characterEncoding=UTF-8" in connection string
Something like this
mysql://USERNAME:PASSWORD#HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
The simplest solution what works for me is to store the data as json_encode.
later when you retrieve just make sure you json_decode it.
Here you don't have to change the collation or the character set of the database and the table.
For Rails, next to the accepted answer, don't forget to add:
encoding: utf8mb4
collation: utf8mb4_bin
to your database.yml
For anyone trying to solve this on a managed MySQL instance (in my case on AWS RDS), the easiest way was to modify the parameter group and set the server character set and collation to be utf8mb4 and utf8mb4_bin, respectively. After rebooting the server, a quick query verifies the settings for system databases and any newly created ones:
SELECT * FROM information_schema.SCHEMATA S;
If you are inserting using PHP, and you have followed the various ALTER database and ALTER table options above, make sure your php connection's charset is utf8mb4.
Example of connection string:
$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc
Notice the "charset" is utf8mb4, not just utf8!
Today I am facing the same question, but solutions in other answers don't work for me. Here is my solution.
First of all, changing charset in mysql/my.ini, database, and the table is necessary, as described in other answers.
Second, if you have created your tables before you want to saving emoji, you can use
SHOW FULL COLUMNS FROM `yourcolumn`;
To check whether the column you want to save emoji is set in utf8mb4. You can find that most of your columns are still in utf8 charset.
Use
ALTER TABLE `yourtable` CHANGE `yourcolumn` `yourcolumn` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
I'm facing this issue when upgrading MySQL 5.0 to MySQL 8.0 AWS RDS, trying many things finally what works for me share with you folks.
Error:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error:
3988 Conversion from collation utf8_unicode_ci into utf8mb4_general_ci
impossible for parameter in /var/www/html/pdo_con.php on line 87
Array (
[0] => HY000
[1] => 3988
[2] => Conversion from collation utf8_unicode_ci into utf8mb4_general_ci impossible for parameter )
Backend: PHP5/php7 + PDO is giving trouble.
Solution: only two thing needs to do
Add a code in line after your pdo connection
$conn->exec("set names utf8mb4");
where $conn is connection handler in PDO
Alter the table and set charset utf8mb4 and collate utf8mb4_unicode_ci.
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
This command will change your every column charset to utf8mb4 and collation too.
Put this right before your database call:
mysqli_set_charset($db, "utf8mb4");
This will allow you to input emojis directly into the database table that has been set to Collation: utfmb4_bin. Make sure to set your column to utfmb4 as well.
Hi my friends
This is how I solved this problem and I was happy to teach it to you as well
I am in the Android application
I encrypt a string containing text and emoj and send it to the server and save it in the mysql table and after receiving it from the server I decrypt it and display it in the textview.
encoded and decoded my message before request and after response:
I send Android app messages to mysql via pdo through this method and receive them with pdo. And I have no problem.
I think it was a good way. Please like
Thankful
public void main()
{
String message="hi mester ali moradi 🌦️🌦️ how are you ?";
String encoded_message=encodeStringUrl(message);
String decode_message=decodeStringUrl(encoded_message);
}
public static String encodeStringUrl(String message) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String message) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
message : hi mester ali moradi 🌦️🌦️ how are you ?
encoded : ghgh%F0%9F%98%AE%F0%9F%A4%90%F0%9F%98%A5
decoded :hi mester ali moradi 🌦️🌦️ how are you ?
If you use command line interface for inserting sql file to database.
Be sure your table charset utf8mb4 and column collation utf8mb4_unicode_ci or utf8mb4_bin
mysql -u root -p123456 my_database < profiles.sql
ERROR 1366 (HY000) at line 1679: Incorrect string value: '\xF0\x9F\x98\x87\xF0\x9F...' for column 'note' at row 328
we can solve the problem with this parameter
--default-character-set=name (Set the default character set)
mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql
Actually i'm using mysql Ver 8.0.23
I had created the both Database and the Table, without Altering them :
mysql> CREATE DATABASE tp2;
Query OK, 1 row affected (0.30 sec)
mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '🀣 oh my god');
Then after select, i thing it just worked fine !
I don't know if it is requested to enter Emoji as a hexadecimal or other encoding string or just copy it as it is... just correct me if i'm wrong, thank you !
I tried different methods and approaches and found a way that worked for me.
The SQL for the update query:
ALTER DATABASE YOUR_DB_NAME_HERE CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_unicode_ci;
You can see in the table, the emoji's are present
And if you go to this page: https://www.thecookingcat.com/recipes/thai-green-curry.php#comments
You can see the emojis in the comments.
I also have an RSS feed on the site and the emojis are included in the RSS feed XML code.
If anyone searching this in 2022 just follow these steps and no need to do any modification on Database
Name Space
using System.Web;
Your normal text like this :
String encode = "thank you 😊"
encode = HttpUtility.UrlEncode(encode);
It will store in Database like this : "thank+you+%f0%9f%98%8a"
And next fetch that data form your Database and do UrlDecode like this
DataSet ds = "Fetch your Encoded data form your Database";
String decode = HttpUtility.UrlDecode(ds.Tables[0].Rows[i]["YourColumnName"].ToString().Trim());
And your output is :-
decode = "thank you 😊".
It is working fine for me and saved time.

How to save emoji in mySQL? [duplicate]

I have a MySQL database configured with the default collation utf8mb4_general_ci. When I try to insert a row containing an emoji character in the text using the following query
insert into tablename
(column1,column2,column3,column4,column5,column6,column7)
values
('273','3','HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29');
MySQL is raising the following error
1366 Incorrect string value: '\xF0\x9F\x98\x83\xF0\x9F...' for column
'comment' at row 1
1) Database: Change Database default collation as utf8mb4.
2) Table: Change table collation as CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.
Query:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Code:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')
4) Set utf8mb4 in database connection:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');
Step 1, change your database's default charset:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
if the db is not created yet, create it with correct encodings:
CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;
Step 2, set charset when creating table:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or alter table
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;
The command to modify the column is:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
And we need to use type = BLOB
Example to modify is as under:-
ALTER TABLE messages MODIFY content BLOB;
I checked that latest mySQL and other databases don't need '' to use in command on table_name, column_name etc.
Fetch and Save data:
Directly save the chat content to column and to retrieve data, fetch data as byte array (byte[]) from db column and then convert it to string e.g. (Java code)
new String((byte[]) arr)
Both the databases and tables should have character set utf8mb4 and collation utf8mb4_unicode_ci.
When creating a new database you should use:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
If you have an existing database and you want to add support:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
You also need to set the correct character set and collation for your tables:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or change it if you've got existing tables with a lot of data:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Note that utf8_general_ci is no longer recommended best practice. See the related Q & A:
What's the difference between utf8_general_ci and utf8_unicode_ci on Stack Overflow.
If you are using Solr + Mysql + Java, you can use:
This can be Used :
case1: When you don`t want to alter DB.
case2: when you have to import emoticons from your Mysql to Solr core.
In above case this is one of the solutions to store your emoticons in your system.
Steps to use it:
Library used: import java.net.URLDecoder;
import java.net.URLEncoder;
Use urlEncoder to encode your String having emoticons.
Store it in DB without altering the MysqlDB.
You can store it in solr core(decoded form)if you want or you can store
encoded form.
When fetching these emoticons from DB or Solr core you can now decode it
Using urlDecoder.
Code example:
import java.net.URLDecoder;
import java.net.URLEncoder;
public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("πŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡³πŸ‡―πŸ‡΅πŸ‡©πŸ‡ͺπŸ”³πŸ”ΊπŸ†”πŸ†”πŸ†‘3⃣5⃣3βƒ£β€Όγ€½βž—βž—πŸŽ¦πŸ”†πŸŽ¦πŸ”†β™‹β™β™‹β™β¬…β¬†β¬…β¬…πŸ›‚πŸšΉπŸ›‚πŸ›„πŸš³πŸš¬πŸ’ŠπŸ”§πŸ’ŠπŸ—Ώ "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}
public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
I have updated my database and table to upgraded from utf8 to utf8mb4. But nothing works for me. Then I tried to update column datatype to blob, luckily it worked for me and data has been saved. Even my database and table both are CHARACTER SET utf8 COLLATE utf8_unicode
My answer only adds to Selvamani P answer.
You might also need to change any SET NAMES utf8 queries with SET NAMES utf8mb4. That did the trick for me.
Also, this is a great article to port your website from utf8 to utf8mb4. In particular the article makes 2 good points on indexes and repairing tables after converting them to utf8mb4:
INDEXES
When converting from utf8 to utf8mb4, the maximum length of a column
or index key is unchanged in terms of bytes. Therefore, it is smaller
in terms of characters, because the maximum length of a character is
now four bytes instead of three. [...] The InnoDB storage engine has a maximum index length of 767 bytes, so for utf8 or utf8mb4 columns, you can index a maximum of 255 or 191 characters, respectively. If you currently have utf8 columns with indexes longer than 191 characters, you will need to index a smaller number of characters when using utf8mb4.
REPAIRING TABLES
After upgrading the MySQL server and making the necessary changes
explained above, make sure to repair and optimize all databases and
tables. I didn’t do this right away after upgrading (I didn’t think it
was necessary, as everything seemed to work fine at first glance), and
ran into some weird bugs where UPDATE statements didn’t have any
effect, even though no errors were thrown.
Read more about the queries to repair tables on the article.
I have a good solution to save your time. I also meet the same problem but I could not solve this problem by the first answer.
Your defualt character is utf-8. But emoji needs utf8mb4 to support it.
If you have the permission to revise the configure file of mysql, you can follow this step.
Therefore, do this following step to upgrade your character set ( from utf-8 to utf8mb4).
step 1. open your my.cnf for mysql, add these following lines to your my.cnf.
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
step2. stop your mysql service, and start mysql service
mysql.server stop
mysql.server start
Finished!
Then you can check your character are changed into utf8mb4.
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/Cellar/mysql#5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)
Well, you need not to change the Whole DB Charset. Instead of that you can do it by changing column to blob type.
ALTER TABLE messages MODIFY content BLOB;
There are two ways-->
# Way one
The simplest is to follow below steps:
Step 1:
SET NAMES utf8mb4;
Step 2:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Step 3:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Step 4:
ALTER TABLE table_name CHANGE column column VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
That's all!!
#Way Two (For Python)
This is a hack and its work like a charm
Step 1:
Encode your string and decode it in ASCII, and save it to your database.
content = 'πŸ₯³πŸ₯³ Content to be save in πŸ₯³πŸ₯³ Database πŸ₯³πŸ₯³'
encoded_content = content.encode('unicode-escape').decode('ASCII'))
This simply store encoded_content string in DB
Step 2:
While fetch this column data to show your user, simply convert it,
here content is the data, fetched from the database.
c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')
Done!!
Emoji support for application having tech stack - mysql, java, springboot, hibernate
Apply below changes in mysql for unicode support.
ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
DB Connection - jdbc url change:
jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8
Note - If the above step is not working please update mysql-connector version to 8.0.15. (mysql 5.7 works with connector version 8.0.15 for unicode support)
The main point hasn't been mentioned in the above answers that,
We need to pass query string with the options "useUnicode=yes" and "characterEncoding=UTF-8" in connection string
Something like this
mysql://USERNAME:PASSWORD#HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
The simplest solution what works for me is to store the data as json_encode.
later when you retrieve just make sure you json_decode it.
Here you don't have to change the collation or the character set of the database and the table.
For Rails, next to the accepted answer, don't forget to add:
encoding: utf8mb4
collation: utf8mb4_bin
to your database.yml
For anyone trying to solve this on a managed MySQL instance (in my case on AWS RDS), the easiest way was to modify the parameter group and set the server character set and collation to be utf8mb4 and utf8mb4_bin, respectively. After rebooting the server, a quick query verifies the settings for system databases and any newly created ones:
SELECT * FROM information_schema.SCHEMATA S;
If you are inserting using PHP, and you have followed the various ALTER database and ALTER table options above, make sure your php connection's charset is utf8mb4.
Example of connection string:
$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc
Notice the "charset" is utf8mb4, not just utf8!
Today I am facing the same question, but solutions in other answers don't work for me. Here is my solution.
First of all, changing charset in mysql/my.ini, database, and the table is necessary, as described in other answers.
Second, if you have created your tables before you want to saving emoji, you can use
SHOW FULL COLUMNS FROM `yourcolumn`;
To check whether the column you want to save emoji is set in utf8mb4. You can find that most of your columns are still in utf8 charset.
Use
ALTER TABLE `yourtable` CHANGE `yourcolumn` `yourcolumn` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
I'm facing this issue when upgrading MySQL 5.0 to MySQL 8.0 AWS RDS, trying many things finally what works for me share with you folks.
Error:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error:
3988 Conversion from collation utf8_unicode_ci into utf8mb4_general_ci
impossible for parameter in /var/www/html/pdo_con.php on line 87
Array (
[0] => HY000
[1] => 3988
[2] => Conversion from collation utf8_unicode_ci into utf8mb4_general_ci impossible for parameter )
Backend: PHP5/php7 + PDO is giving trouble.
Solution: only two thing needs to do
Add a code in line after your pdo connection
$conn->exec("set names utf8mb4");
where $conn is connection handler in PDO
Alter the table and set charset utf8mb4 and collate utf8mb4_unicode_ci.
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
This command will change your every column charset to utf8mb4 and collation too.
Put this right before your database call:
mysqli_set_charset($db, "utf8mb4");
This will allow you to input emojis directly into the database table that has been set to Collation: utfmb4_bin. Make sure to set your column to utfmb4 as well.
Hi my friends
This is how I solved this problem and I was happy to teach it to you as well
I am in the Android application
I encrypt a string containing text and emoj and send it to the server and save it in the mysql table and after receiving it from the server I decrypt it and display it in the textview.
encoded and decoded my message before request and after response:
I send Android app messages to mysql via pdo through this method and receive them with pdo. And I have no problem.
I think it was a good way. Please like
Thankful
public void main()
{
String message="hi mester ali moradi 🌦️🌦️ how are you ?";
String encoded_message=encodeStringUrl(message);
String decode_message=decodeStringUrl(encoded_message);
}
public static String encodeStringUrl(String message) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String message) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
message : hi mester ali moradi 🌦️🌦️ how are you ?
encoded : ghgh%F0%9F%98%AE%F0%9F%A4%90%F0%9F%98%A5
decoded :hi mester ali moradi 🌦️🌦️ how are you ?
If you use command line interface for inserting sql file to database.
Be sure your table charset utf8mb4 and column collation utf8mb4_unicode_ci or utf8mb4_bin
mysql -u root -p123456 my_database < profiles.sql
ERROR 1366 (HY000) at line 1679: Incorrect string value: '\xF0\x9F\x98\x87\xF0\x9F...' for column 'note' at row 328
we can solve the problem with this parameter
--default-character-set=name (Set the default character set)
mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql
Actually i'm using mysql Ver 8.0.23
I had created the both Database and the Table, without Altering them :
mysql> CREATE DATABASE tp2;
Query OK, 1 row affected (0.30 sec)
mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '🀣 oh my god');
Then after select, i thing it just worked fine !
I don't know if it is requested to enter Emoji as a hexadecimal or other encoding string or just copy it as it is... just correct me if i'm wrong, thank you !
I tried different methods and approaches and found a way that worked for me.
The SQL for the update query:
ALTER DATABASE YOUR_DB_NAME_HERE CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_unicode_ci;
You can see in the table, the emoji's are present
And if you go to this page: https://www.thecookingcat.com/recipes/thai-green-curry.php#comments
You can see the emojis in the comments.
I also have an RSS feed on the site and the emojis are included in the RSS feed XML code.
If anyone searching this in 2022 just follow these steps and no need to do any modification on Database
Name Space
using System.Web;
Your normal text like this :
String encode = "thank you 😊"
encode = HttpUtility.UrlEncode(encode);
It will store in Database like this : "thank+you+%f0%9f%98%8a"
And next fetch that data form your Database and do UrlDecode like this
DataSet ds = "Fetch your Encoded data form your Database";
String decode = HttpUtility.UrlDecode(ds.Tables[0].Rows[i]["YourColumnName"].ToString().Trim());
And your output is :-
decode = "thank you 😊".
It is working fine for me and saved time.

How to make full support of emoji in MySQL? [duplicate]

I have a MySQL database configured with the default collation utf8mb4_general_ci. When I try to insert a row containing an emoji character in the text using the following query
insert into tablename
(column1,column2,column3,column4,column5,column6,column7)
values
('273','3','HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29');
MySQL is raising the following error
1366 Incorrect string value: '\xF0\x9F\x98\x83\xF0\x9F...' for column
'comment' at row 1
1) Database: Change Database default collation as utf8mb4.
2) Table: Change table collation as CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.
Query:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Code:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'HdhdhdhπŸ˜œπŸ˜€πŸ˜ŠπŸ˜ƒhzhzhzzhjzj ζˆ‘ηˆ±δ½  ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')
4) Set utf8mb4 in database connection:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');
Step 1, change your database's default charset:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
if the db is not created yet, create it with correct encodings:
CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;
Step 2, set charset when creating table:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or alter table
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;
The command to modify the column is:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
And we need to use type = BLOB
Example to modify is as under:-
ALTER TABLE messages MODIFY content BLOB;
I checked that latest mySQL and other databases don't need '' to use in command on table_name, column_name etc.
Fetch and Save data:
Directly save the chat content to column and to retrieve data, fetch data as byte array (byte[]) from db column and then convert it to string e.g. (Java code)
new String((byte[]) arr)
Both the databases and tables should have character set utf8mb4 and collation utf8mb4_unicode_ci.
When creating a new database you should use:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
If you have an existing database and you want to add support:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
You also need to set the correct character set and collation for your tables:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
or change it if you've got existing tables with a lot of data:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Note that utf8_general_ci is no longer recommended best practice. See the related Q & A:
What's the difference between utf8_general_ci and utf8_unicode_ci on Stack Overflow.
If you are using Solr + Mysql + Java, you can use:
This can be Used :
case1: When you don`t want to alter DB.
case2: when you have to import emoticons from your Mysql to Solr core.
In above case this is one of the solutions to store your emoticons in your system.
Steps to use it:
Library used: import java.net.URLDecoder;
import java.net.URLEncoder;
Use urlEncoder to encode your String having emoticons.
Store it in DB without altering the MysqlDB.
You can store it in solr core(decoded form)if you want or you can store
encoded form.
When fetching these emoticons from DB or Solr core you can now decode it
Using urlDecoder.
Code example:
import java.net.URLDecoder;
import java.net.URLEncoder;
public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("πŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡³πŸ‡―πŸ‡΅πŸ‡©πŸ‡ͺπŸ”³πŸ”ΊπŸ†”πŸ†”πŸ†‘3⃣5⃣3βƒ£β€Όγ€½βž—βž—πŸŽ¦πŸ”†πŸŽ¦πŸ”†β™‹β™β™‹β™β¬…β¬†β¬…β¬…πŸ›‚πŸšΉπŸ›‚πŸ›„πŸš³πŸš¬πŸ’ŠπŸ”§πŸ’ŠπŸ—Ώ "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}
public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
I have updated my database and table to upgraded from utf8 to utf8mb4. But nothing works for me. Then I tried to update column datatype to blob, luckily it worked for me and data has been saved. Even my database and table both are CHARACTER SET utf8 COLLATE utf8_unicode
My answer only adds to Selvamani P answer.
You might also need to change any SET NAMES utf8 queries with SET NAMES utf8mb4. That did the trick for me.
Also, this is a great article to port your website from utf8 to utf8mb4. In particular the article makes 2 good points on indexes and repairing tables after converting them to utf8mb4:
INDEXES
When converting from utf8 to utf8mb4, the maximum length of a column
or index key is unchanged in terms of bytes. Therefore, it is smaller
in terms of characters, because the maximum length of a character is
now four bytes instead of three. [...] The InnoDB storage engine has a maximum index length of 767 bytes, so for utf8 or utf8mb4 columns, you can index a maximum of 255 or 191 characters, respectively. If you currently have utf8 columns with indexes longer than 191 characters, you will need to index a smaller number of characters when using utf8mb4.
REPAIRING TABLES
After upgrading the MySQL server and making the necessary changes
explained above, make sure to repair and optimize all databases and
tables. I didn’t do this right away after upgrading (I didn’t think it
was necessary, as everything seemed to work fine at first glance), and
ran into some weird bugs where UPDATE statements didn’t have any
effect, even though no errors were thrown.
Read more about the queries to repair tables on the article.
I have a good solution to save your time. I also meet the same problem but I could not solve this problem by the first answer.
Your defualt character is utf-8. But emoji needs utf8mb4 to support it.
If you have the permission to revise the configure file of mysql, you can follow this step.
Therefore, do this following step to upgrade your character set ( from utf-8 to utf8mb4).
step 1. open your my.cnf for mysql, add these following lines to your my.cnf.
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
step2. stop your mysql service, and start mysql service
mysql.server stop
mysql.server start
Finished!
Then you can check your character are changed into utf8mb4.
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/Cellar/mysql#5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)
Well, you need not to change the Whole DB Charset. Instead of that you can do it by changing column to blob type.
ALTER TABLE messages MODIFY content BLOB;
There are two ways-->
# Way one
The simplest is to follow below steps:
Step 1:
SET NAMES utf8mb4;
Step 2:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Step 3:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Step 4:
ALTER TABLE table_name CHANGE column column VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
That's all!!
#Way Two (For Python)
This is a hack and its work like a charm
Step 1:
Encode your string and decode it in ASCII, and save it to your database.
content = 'πŸ₯³πŸ₯³ Content to be save in πŸ₯³πŸ₯³ Database πŸ₯³πŸ₯³'
encoded_content = content.encode('unicode-escape').decode('ASCII'))
This simply store encoded_content string in DB
Step 2:
While fetch this column data to show your user, simply convert it,
here content is the data, fetched from the database.
c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')
Done!!
Emoji support for application having tech stack - mysql, java, springboot, hibernate
Apply below changes in mysql for unicode support.
ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
DB Connection - jdbc url change:
jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8
Note - If the above step is not working please update mysql-connector version to 8.0.15. (mysql 5.7 works with connector version 8.0.15 for unicode support)
The main point hasn't been mentioned in the above answers that,
We need to pass query string with the options "useUnicode=yes" and "characterEncoding=UTF-8" in connection string
Something like this
mysql://USERNAME:PASSWORD#HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
The simplest solution what works for me is to store the data as json_encode.
later when you retrieve just make sure you json_decode it.
Here you don't have to change the collation or the character set of the database and the table.
For Rails, next to the accepted answer, don't forget to add:
encoding: utf8mb4
collation: utf8mb4_bin
to your database.yml
For anyone trying to solve this on a managed MySQL instance (in my case on AWS RDS), the easiest way was to modify the parameter group and set the server character set and collation to be utf8mb4 and utf8mb4_bin, respectively. After rebooting the server, a quick query verifies the settings for system databases and any newly created ones:
SELECT * FROM information_schema.SCHEMATA S;
If you are inserting using PHP, and you have followed the various ALTER database and ALTER table options above, make sure your php connection's charset is utf8mb4.
Example of connection string:
$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc
Notice the "charset" is utf8mb4, not just utf8!
Today I am facing the same question, but solutions in other answers don't work for me. Here is my solution.
First of all, changing charset in mysql/my.ini, database, and the table is necessary, as described in other answers.
Second, if you have created your tables before you want to saving emoji, you can use
SHOW FULL COLUMNS FROM `yourcolumn`;
To check whether the column you want to save emoji is set in utf8mb4. You can find that most of your columns are still in utf8 charset.
Use
ALTER TABLE `yourtable` CHANGE `yourcolumn` `yourcolumn` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
I'm facing this issue when upgrading MySQL 5.0 to MySQL 8.0 AWS RDS, trying many things finally what works for me share with you folks.
Error:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error:
3988 Conversion from collation utf8_unicode_ci into utf8mb4_general_ci
impossible for parameter in /var/www/html/pdo_con.php on line 87
Array (
[0] => HY000
[1] => 3988
[2] => Conversion from collation utf8_unicode_ci into utf8mb4_general_ci impossible for parameter )
Backend: PHP5/php7 + PDO is giving trouble.
Solution: only two thing needs to do
Add a code in line after your pdo connection
$conn->exec("set names utf8mb4");
where $conn is connection handler in PDO
Alter the table and set charset utf8mb4 and collate utf8mb4_unicode_ci.
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
This command will change your every column charset to utf8mb4 and collation too.
Put this right before your database call:
mysqli_set_charset($db, "utf8mb4");
This will allow you to input emojis directly into the database table that has been set to Collation: utfmb4_bin. Make sure to set your column to utfmb4 as well.
Hi my friends
This is how I solved this problem and I was happy to teach it to you as well
I am in the Android application
I encrypt a string containing text and emoj and send it to the server and save it in the mysql table and after receiving it from the server I decrypt it and display it in the textview.
encoded and decoded my message before request and after response:
I send Android app messages to mysql via pdo through this method and receive them with pdo. And I have no problem.
I think it was a good way. Please like
Thankful
public void main()
{
String message="hi mester ali moradi 🌦️🌦️ how are you ?";
String encoded_message=encodeStringUrl(message);
String decode_message=decodeStringUrl(encoded_message);
}
public static String encodeStringUrl(String message) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String message) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
message : hi mester ali moradi 🌦️🌦️ how are you ?
encoded : ghgh%F0%9F%98%AE%F0%9F%A4%90%F0%9F%98%A5
decoded :hi mester ali moradi 🌦️🌦️ how are you ?
If you use command line interface for inserting sql file to database.
Be sure your table charset utf8mb4 and column collation utf8mb4_unicode_ci or utf8mb4_bin
mysql -u root -p123456 my_database < profiles.sql
ERROR 1366 (HY000) at line 1679: Incorrect string value: '\xF0\x9F\x98\x87\xF0\x9F...' for column 'note' at row 328
we can solve the problem with this parameter
--default-character-set=name (Set the default character set)
mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql
Actually i'm using mysql Ver 8.0.23
I had created the both Database and the Table, without Altering them :
mysql> CREATE DATABASE tp2;
Query OK, 1 row affected (0.30 sec)
mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '🀣 oh my god');
Then after select, i thing it just worked fine !
I don't know if it is requested to enter Emoji as a hexadecimal or other encoding string or just copy it as it is... just correct me if i'm wrong, thank you !
I tried different methods and approaches and found a way that worked for me.
The SQL for the update query:
ALTER DATABASE YOUR_DB_NAME_HERE CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_unicode_ci;
You can see in the table, the emoji's are present
And if you go to this page: https://www.thecookingcat.com/recipes/thai-green-curry.php#comments
You can see the emojis in the comments.
I also have an RSS feed on the site and the emojis are included in the RSS feed XML code.
If anyone searching this in 2022 just follow these steps and no need to do any modification on Database
Name Space
using System.Web;
Your normal text like this :
String encode = "thank you 😊"
encode = HttpUtility.UrlEncode(encode);
It will store in Database like this : "thank+you+%f0%9f%98%8a"
And next fetch that data form your Database and do UrlDecode like this
DataSet ds = "Fetch your Encoded data form your Database";
String decode = HttpUtility.UrlDecode(ds.Tables[0].Rows[i]["YourColumnName"].ToString().Trim());
And your output is :-
decode = "thank you 😊".
It is working fine for me and saved time.

PHP - Displaying Urdu text retrieved from MySQL DB

There are book titles in Urdu language stored in MySQL database. I've to display on html page using PHP.
Currently only questions marks(??????) are displayed in place of Urdu text.
<div class='product_title'><a href='details.php?pid=".$Row['s_id']."'>".$Row["books"]."</a></div>
What needs to be done to display these characters properly?
Step : 1 - Go to table structure and change collation latin1_swedish_ci to utf8_general_ci
Step : 2 -
You have to include this following tag in data results pages.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Step :3 - Insert 'N' Prefix. Here the N stands for National language character set. Which means that you are passing an NCHAR, NVARCHAR or NTEXT value, more
Step :4 - PHP code displaying records form database. Before that you have to specify mysql_query() function data character set type
<?php
include('db.php');
mysql_query ("set character_set_results='utf8'");
$query = mysql_query("SELECT * FROM books") or die(mysql_error());
while($row=mysql_fetch_array($query))
{
echo $row['id']; // Book id
echo $row['books_title']; // Book title
}
?>
Also your files encoding mustbe utf-8 without BOM
I faced the same issue and solved by manipulating the character encoding of the entire PHP-MySQL environment.
By Default the character set encoding in PHPMyAdmin is generally Latin Swedish or utf8 general, However, other languages like Urdu, Chinese and more are not supported in the character set encoding, So you need to change the character encoding of your MySQL database or table or column as per your requirement.
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
You also need to set the character encoding for the data retrieved using mysqli_query. You can do so by using mysqli_charset() function just below the connection line. Like...
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
/* change character set to utf8mb4 */
mysqli_set_charset($conn,"utf8mb4");
Now You can display Urdu or any other Language directly by retrieving from MySQL database through PHP Query.
I had faced this problem and i have solved this error by convert them to UTF-8.
ALTER TABLE test_Table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE test_Table_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE test_Table_name CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;

Categories