为什么我的 table 的编码错误?

Why is my table's encoding wrong?

我正在使用 Rails 5 和 MySQL 5.7。我的 database.yml 中有以下内容:

default: &default
  adapter: mysql2
  pool: 5
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_unicode_ci
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: [...]
  username: [...]
  password: [...]

我 运行 rake db:reset 重新创建我的数据库,我 运行 show create table users 我看到 CREATE TABLEusers([...]) ENGINE=InnoDB DEFAULT CHARSET=utf8.

为什么我的 CHARSET=utf8 以及我该如何解决它(使其等于 utf8mb4)?谢谢。

创建 table 时要明确:

CREATE TABLE users (
        name VARCHAR(99)  NOT NULL,
        ...
    ) ENGINE=InnoDB  DEFAULT CHARACTER SET utf8mb4;

另一种技术是忽略 table 默认值,并在每一列上明确显示:

CREATE TABLE users (
        name VARCHAR(99)  CHARACTER SET utf8mb4  NOT NULL,
        ...
    ) ENGINE=InnoDB;

可能发生的事情是你在两个地方都没有指定字符集,但是数据库上的DEFAULT是utf8 .

rake db:reset 是错误的。 rake db:drop && rake db:create && rake db:migrate 正确。

reset 刚刚从已存储的模式创建了表,该模式具有错误的字符集和排序规则。但是从迁移中重新创建它们会使用新的字符集和排序规则创建它们。

问题是 db:reset 调用 db:schema:load。如果您的 db/schema.rb 文件有错误的编码值,它将加载错误的内容。您可以修复 db/schema.rb 以在 运行 db:reset

之前获得正确的编码