Liquibase:如何在 MySQL 数据库表上设置 Charset UTF-8?

Posted

技术标签:

【中文标题】Liquibase:如何在 MySQL 数据库表上设置 Charset UTF-8?【英文标题】:Liquibase: How to set Charset UTF-8 on MySQL database tables? 【发布时间】:2014-07-08 03:41:37 【问题描述】:

我的 Liquibase 变更集看起来像

<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>
我已使用插件将 liquibase 与 Maven 集成 当我运行mvn clean install 时,它会创建mysql 类似的表

创建表network (network_id bigint(19) 无符号非空, name varchar(300) 非空,active tinyint(1) 非空默认 '1', created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,created_by varchar(100) DEFAULT NULL, updated_at timestamp NULL 默认空值,updated_by varchar(100) 默认空值,主键 (network_id) ENGINE=InnoDB DEFAULT CHARSET=latin1;

除了CHARSET=latin1之外,一切看起来都不错

问题

我怎样才能使CHARSET=UTF-8

【问题讨论】:

您是否尝试将force-replace 设置为所需的值? 【参考方案1】:

您可以在创建表定义后使用modifySql element:

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

【讨论】:

是否可以在启动 db 迁移过程时单独写入,如果数据库已经部署在其他地方,则会触发错误。? 或者这个&lt;/createTable&gt; &lt;modifySql&gt; &lt;append value=" ENGINE=InnoDB DEFAULT CHARSET=utf8"/&gt; &lt;/modifySql&gt; &lt;/changeSet 需要手动添加这些更改是否正确?我希望 liquibase 能将其检测为 liquibase:diff 的一部分【参考方案2】:

如果需要按列指定 charset/collat​​e(因为您可能希望列使用不同的字符集),以下对我有用(只需将 CHARACTER SET 和 COLLATE 子句附加到 type attr 值 column ):

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

或者,您可以使用:

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

您可以省略CHARACTER SET,但不能省略COLLATE

【讨论】:

你用哪个 Liquibase 版本测试过这个?似乎在 3.4.1 中不起作用 @jso 用 3.5.3 版本测试过。 第二个对我有用。 modifySql 必须在所有 createTable 元素之后,您可能需要将其他元素移动到另一个 changeSet 中。【参考方案3】:

从文档来看,Charset 是依赖于数据库的,如果是这样的话,从文档来看你可以使用

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

查看 MySql 文档,您可能只需将这一行插入:

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

【讨论】:

当表中有外键时不起作用【参考方案4】:

通常字符集的配置是在数据库创建时完成的,你应该像这样在你的 liquibase 配置文件中配置它:

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

欲了解更多信息,请参阅:https://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

或者如果您已经使用不同的字符集创建了一个数据库,您可以尝试转换它,请参阅:

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

【讨论】:

以上是关于Liquibase:如何在 MySQL 数据库表上设置 Charset UTF-8?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 liquibase OracleDatabase 中添加保留关键字?

将 Liquibase 引入现有项目和 MySQL

如何使 liquibase 的 LoadData 标签不区分大小写?

如何在低规格系统上的大表上提高 MySQL 性能?

liquibase的使用

Liquibase 了解