---
title: utf8mb4 最好从第一天就设成默认
date: '2013-05-14 21:46:49'
draft: false
summary: 字符集这类基础设置一旦拖到中后期再补，迁移成本通常会远高于一开始就设对。
slug: utf8mb4-should-be-default-from-day-one
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/zwIukDlMQ
tags:
- mysql
- utf8mb4
- java
- database
topics:
- software-engineering
type: post
---

这类坑我又栽了一次，所以顺手把最小处理清单记下来。对一套已经上线的系统来说，字符集问题一旦拖到后面再补，代价通常会比一开始设对高很多。

如果你的库后面迟早要支持 emoji、多语言或者更复杂的字符，`utf8mb4` 最好从第一天就作为默认配置。

我当时的处理步骤大致是：

1. 在 `my.cnf` 里把 `character-set-server` 改成 `utf8mb4`
2. 对已有表执行 `alter table ... convert to character set utf8mb4 collate utf8mb4_bin`
3. 升级 Java 的 `mysql-driver`

第三步也别漏。驱动版本太老的话，数据库即使已经切到 `utf8mb4`，应用侧还是可能继续掉坑。我当时确认可用的是 `5.1.25`，理论上 `5.1.14` 之后应该就可以，但这一点我没有再往下细抠。

所以这件事最实际的结论还是：如果是新建库，先把字符集想清楚，不要等业务跑起来之后再返工。
