Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Liquibase: How to set Charset UTF-8 on MySQL database tables?

My Liquibase changeset looks like

<changeSet id="05192014.1525" author="h2">
        <createTable tableName="network">
            <column name="network_id" type="BIGINT(19) UNSIGNED">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="name" type="VARCHAR(300)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="TINYINT(1)" defaultValue="1">
                <constraints nullable="false"/>
            </column>
            <column name="created_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
                <constraints nullable="false"/>
            </column>
            <column name="created_by" type="VARCHAR(100)"/>
            <column name="updated_at" type="TIMESTAMP"/>
            <column name="updated_by" type="VARCHAR(100)"/>
        </createTable>
    </changeSet>
  • I have integrated liquibase with Maven using plugin
  • When I run mvn clean install, it creates MySQL table like

CREATE TABLE network ( network_id bigint(19) unsigned NOT NULL, name varchar(300) NOT NULL, active tinyint(1) NOT NULL DEFAULT '1', created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by varchar(100) DEFAULT NULL, updated_at timestamp NULL DEFAULT NULL, updated_by varchar(100) DEFAULT NULL, PRIMARY KEY (network_id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Everything looks good except CHARSET=latin1

Question

How can I make CHARSET=UTF-8?

like image 739
daydreamer Avatar asked May 20 '14 02:05

daydreamer


1 Answers

If needing per-column specification of charset/collate (as you may want different charsets for your columns), the following has worked for me (just appending CHARACTER SET and COLLATE clauses to the type attr value of column):

    <createTable tableName="my_table">
        <column name="some_column" type="VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" >
            <constraints nullable="false"/>
        </column>
    </createTable>

Alternatively, you can use:

    <createTable tableName="my_table">
        <column name="some_column" type="VARCHAR(20)" >
            <constraints nullable="false"/>
        </column>
    </createTable>
    <modifySql dbms="mysql">
        <replace replace="VARCHAR(20)" with="VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" />
    </modifySql>

You can omit CHARACTER SET but not COLLATE.

like image 115
Pavel S. Avatar answered Sep 26 '22 09:09

Pavel S.