2014-05-20 35 views
9

Moja Liquibase changeset wyglądaLiquibase: Jak ustawić Charset UTF-8 na tabelach bazy danych 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> 
  • mam zintegrowany liquibase z Maven za pomocą wtyczki
  • Kiedy biegnę mvn clean install tworzy MySQL stół jak

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

Wszystko wygląda dobrze z wyjątkiem CHARSET=latin1

Pytanie

Jak mogę dokonać CHARSET=UTF-8?

+1

Czy próbowałeś [wymusić-wymień] (http://www.liquibase.org/documentation/modify_sql.html) na wymaganą wartość? –

Odpowiedz

1

Od patrząc na documenation, Kodowanie jest baza danych uzależniona, a jeśli tak jest, sądząc z dokumentacją można użyć

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

Patrząc na dokumentacji MySQL można prawdopodobnie wystarczy podłączyć ten wiersz w:

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

nie działa, gdy masz klucz obcy w tabeli – psv

8

można użyć modifySql element po swojej stworzenia definicji tabeli:

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

Zazwyczaj konfiguracja zestawu znaków odbywa się na czas tworzenia bazy danych i należy skonfigurować je na swoim liquibase pliku konfiguracyjnym jak ten:

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

Aby uzyskać więcej informacji zobacz: https://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

lub jeśli już baza danych stworzona z innym charset można spróbować przekształcić go zobaczyć:

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

1

W przypadku konieczności specyfikacji per-kolumna charset/Sortuj (a może chcesz różne zestawy znaków dla swoich kolumnach), następujące pracował dla mnie (tylko dołączenie zestawu znaków i zestawiania klauzule wartości type attr z column):

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

Alternatywnie, można użyć:

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

można pominąć CHARACTER SET ale nie COLLATE.

+0

Którą wersję Liquibase przetestowałeś? Wydaje się nie działać w 3.4.1 – jso

+0

@jso Został przetestowany z wersją 3.5.3. –