Convert non-UTF-8 MySQL database to UTF-8
Platform Notice: Data Center Only - This article only applies to Atlassian products on the Data Center platform.
Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data-Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Summary
Database upgrades may fail due to a wrong character set usage. This article explains how to convert a non-UTF-8 MySQL database into the recommended UTF-8 database.
Always back up your data before making any database modifications. If possible, test any alter, insert, update, or delete SQL commands on a staging server first.
Solution
Let's suppose the database is using
latin1
character set andlatin1_general_cs
collation:1
CREATE DATABASE dbname CHARACTER SET latin1 COLLATE latin1_general_cs;
Make sure that Fisheye / Crucible is not running;
Connect to the database being used by Fisheye / Crucible;
Create a database dump:
1
mysqldump --opt -u root -p<secret> dbname > dbname.sql
Open the resulting
dbname.sql
file and replace all occurrences oflatin1_general_cs
byutf8_bin
and all occurrences oflatin1
byutf8
, through find / replace, then save changes.Restore
dbname.sql
. There are two possibilities here:Restore into a new database name, if you want to keep the original database untouched. This consists in:
Creating a new database, this time using the correct character set and collation:
1
CREATE DATABASE newdbname CHARACTER SET utf8 COLLATE utf8_bin;
Restoring the dump:
1
mysql -u root -p<secret> newdbname < dbname.sql
Restore into the existing database name, if you're sure that the manual changes in
dbname.sql
through find / replace are correct. This consists in:Deleting the current database
dbname
:1
DROP DATABASE dbname;
Creating it again, this time using the correct character set and collation:
1
CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_bin;
Restoring the dump:
1
mysql -u root -p<secret> dbname < dbname.sql
Restart MySQL service
Start Fisheye / Crucible
Was this helpful?