Размер строки MySQL слишком большой, но только в 5,7 - PullRequest
0 голосов
/ 18 мая 2018

Когда я использую rake db:schema:load для создания следующей таблицы на моем ноутбуке с MySQL 5.6.22, он прекрасно загружается:

  create_table "inv_audits", force: :cascade do |t|
    t.integer  "inv_node_id",         limit: 2,                         null: false
    t.integer  "inv_object_id",       limit: 4,                         null: false
    t.integer  "inv_version_id",      limit: 4,                         null: false
    t.integer  "inv_file_id",         limit: 4,                         null: false
    t.string   "url",                 limit: 16383
    t.string   "status",              limit: 18,    default: "unknown", null: false
    t.datetime "created",                                               null: false
    t.datetime "verified"
    t.datetime "modified"
    t.integer  "failed_size",         limit: 8,     default: 0,         null: false
    t.string   "failed_digest_value", limit: 255
    t.text     "note",                limit: 65535
  end

Однако, когда я пытаюсь сделать то же самое на своем рабочем столе5.7.21, происходит сбой при Mysql2::Error: Row size too large.

Сгенерированный SQL из трассировки:

CREATE TABLE `inv_audits` (
  `id`                  int(11) auto_increment PRIMARY KEY,
  `inv_node_id`         smallint                      NOT NULL,
  `inv_object_id`       int(11)                       NOT NULL,
  `inv_version_id`      int(11)                       NOT NULL,
  `inv_file_id`         int(11)                       NOT NULL,
  `url`                 varchar(16383),
  `status`              varchar(18) DEFAULT 'unknown' NOT NULL,
  `created`             datetime                      NOT NULL,
  `verified`            datetime,
  `modified`            datetime,
  `failed_size`         bigint DEFAULT 0              NOT NULL,
  `failed_digest_value` varchar(255),
  `note`                text
) ENGINE=InnoDB

Почему это не получится в 5.7, но будет успешным в 5.6?

Обе машины являются 64-разрядными компьютерами Mac с операционной системой MacOS High Sierra (10.13.4).

1 Ответ

0 голосов
/ 18 мая 2018

Набор символов для столбцов типа символов, в частности, столбец url VARCHAR.

Атрибут длины в определении типа данных VARCHAR(16383) указывает число символов .

Но предел размера строки InnoDB составляет байтов .

При однобайтовом наборе символов (например, latin1) столбец будет иметь максимальное количество байтов 16383 (плюс место для скрытой длины).Это было бы хорошо.

С многобайтовым набором символов, например, utf8 (до 3 байт на символ) или utf8mb4 (до 4 байт на символ), необходимое количество байт будет превышать максимально допустимый байтдля строки InnoDB.


В системе 5.6 мы можем сделать

 SHOW CREATE TABLE inv_audits

Если для столбца не указан набор символов / сопоставление, по умолчанию для таблицы действует,(Набор символов для таблицы может быть указан, в противном случае он наследует набор по умолчанию для базы данных.)

Чтобы получить таблицу, созданную на 5.7, в качестве теста, уменьшите размер VARCHAR до 1/4текущего значения, а затем взгляните на CREATE TABLE.

 SHOW CREATE TABLE inv_audits

И это будет многобайтовый набор символов, такой как utf8 или utf8mb4.


Держу пари, что основной причиной проблемы является то, что набор символов по умолчанию отличаетсяв 5,6 и 5,7

...