2014-05-20 18 views
9

Mein Liquibase changeset wieLiquibase: Wie setze ich Charset UTF-8 auf MySQL-Datenbanktabellen?

<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 integriert haben liquibase mit Maven mit Plugin
  • Wenn ich mvn clean install laufen, schafft es MySQL Tisch wie

CREATE TABLE network (network_id sieht bigint (19) unsigniert NOT NULL, name VARCHAR (300) NOT NULL, active Tinyint (1) NOT NULL DEFAULT '1' created_at Zeitstempel NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by VARCHAR (100) DEFAULT NULL, updated_at Zeitstempel NULL DEFAULT NULL, updated_by VARCHAR (100) DEFAULT NULL, PRIMÄRSCHLÜSSEL (network_id)) ENGINE = InnoDB DEFAULT CHARSET = latin1;

Alles sieht gut aus, außer CHARSET=latin1

Frage

Wie kann ich CHARSET=UTF-8 machen?

+1

Haben Sie versucht, [erzwingen-ersetzen] (http://www.liquibase.org/documentation/modify_sql.html) es auf den erforderlichen Wert? –

Antwort

1

Von am documenation suchen, ist Charset Datenbank abhängig ist, und wenn das der Fall ist, aus der Dokumentation zu urteilen können Sie

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

Mit Blick auf die MySQL-Dokumentation verwenden, könnten Sie wahrscheinlich diese Zeile einfach anschließen in:

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

funktioniert nicht, wenn Sie Fremdschlüssel in der Tabelle haben – psv

8

Sie können die modifySql element nach dem erstellen Tabellendefinition verwenden:

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

Normalerweise ist die Konfiguration des charset auf der Erstellung der Datenbank durchgeführt, und Sie sollen es auf Ihrer liquibase-Konfigurationsdatei wie folgt konfiguriert werden:

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

für weitere Informationen siehe: https://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

oder wenn Sie schon haben Sie könnten versuchen, eine Datenbank mit einem anderen Zeichensatz erstellt konvertieren es sehen:

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

1

pro-Spaltenangabe von charset/collate Wenn benötigen (wie Sie verschiedene charsets für Ihre Spalten möchten) hat die folgenden für mich gearbeitet (nur CHARACTER SET anhängt und COLLATE-Klauseln zum type attr Wert von column):

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

Alternativ können Sie verwenden:

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

Sie CHARACTER SET auslassen können, aber nicht COLLATE.

+0

Mit welcher Liquibase-Version haben Sie das getestet? Scheint nicht zu funktionieren in 3.4.1 – jso

+0

@jso Es wurde mit Version 3.5.3 getestet. –

Verwandte Themen