2014-05-20 3 views
9

mio Liquibase di modifiche assomigliaLiquibase: come impostare Charset UTF-8 sulle tabelle del database MySQL?

<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> 
  • ho integrato liquibase con Maven utilizzando plugin di
  • Quando eseguo mvn clean install, crea MySQL tavolo come

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

Tutto sembra buono, tranne CHARSET=latin1

Domanda

Come posso fare CHARSET=UTF-8?

+1

Hai provato a [forza sostituire] (http://www.liquibase.org/documentation/modify_sql.html) al valore richiesto? –

risposta

1

Guardando la documenation, charset è database di dipendenti, e se questo è il caso, a giudicare dalla documentazione che si può usare

http://www.liquibase.org/documentation/changes/sql.html

Guardando la documentazione di MySQL si potrebbe probabilmente basta collegare questa linea in:

<sql>ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;</sql> 
+0

non funziona quando si dispone di chiave esterna (s) nella tabella – psv

8

È possibile utilizzare il modifySql element dopo la vostra creare definizione di tabella:

</createTable> 
<modifySql dbms="mysql"> 
    <append value="ENGINE=INNODB CHARSET=UTF8 COLLATE utf8_unicode_ci"/> 
</modifySql> 
1

Di solito la configurazione del charset è fatto in tempo creazione del database, e si dovrebbe configurare il vostro file di configurazione liquibase come questo:

url: jdbc:mysql://localhost:3306/yourdatabasename?useUnicode=true&characterEncoding=utf8 

per maggiori informazioni visita: https://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

o se si dispone già di un database creato con un set di caratteri diverso si potrebbe provare a convertirlo vedere:

How to convert an entire MySQL database characterset and collation to UTF-8?

1

Se necessitano di specifiche per ogni colonna del set di caratteri/fascicolazione (come si potrebbe voler set di caratteri differenti per le colonne), il seguente ha funzionato per me (solo aggiungendo set di caratteri e COLLATE clausole al valore type attr di column):

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

In alternativa, è possibile utilizzare:

<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> 

È possibile omettere CHARACTER SET ma non COLLATE.

+0

Quale versione Liquibase hai testato questo con? Non sembra funzionare in 3.4.1 – jso

+0

@jso È stato testato con la versione 3.5.3. –