Я использую MySQL 5.6 и я хочу изменить кодировку по умолчанию один стол (от латинских типа 1 в utf8), не изменяя существующие строки и столбцы.
На основе документации, я пробовал следующую команду:
ALTER TABLE mytable DEFAULT CHARACTER SET utf8;
Он модифицировал кодировка по умолчанию кодировка от моего стола и не изменил параметры сортировки столбцов, как ожидалось, но я был очень удивлен увидеть:
Query OK, 32141 rows affected (6.31 sec)
Records: 32141 Duplicates: 0 Warnings: 0
Кроме "32141 затронутых строк", результаты, как ожидается, как вы можете увидеть ниже:
MySQL> select count(*) from mytable;
MySQL> show table status like 'mytable';
MySQL> show create table mytable;
CREATE TABLE `mytable` (
`ID` varchar(255) NOT NULL,
`COL1` double DEFAULT NULL,
`COL2` longtext CHARACTER SET latin1,
`COL3` datetime DEFAULT NULL,
`COL4` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`COL5` int(11) DEFAULT NULL,
`COL6` datetime DEFAULT NULL,
`COL7` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`COL8` datetime(3) NOT NULL,
`COL9` int(11) NOT NULL DEFAULT '
MySQL> show full columns from mytable;
Мои параметры соединения следующим образом:
MySQL> show variables where variable_name like '%char%' or variable_name like '%collation%';
Обратите внимание, что:
данных была создана на основе Java-приложения
во время создания данных, параметры подключения были заданы в utf8
нет ФК, связанные с этой таблицей
Когда я пытаюсь воспроизвести некоторые вновь созданные таблицы, кажется, что строки не изменяются. См. ниже "0 затронутых строк":
MySQL> select count(*) from mytesttable;
MySQL> alter table mytesttable character set utf8;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
Я пытался изменить мои параметры соединения обратно в latin1 во время создания данных, но это не меняет результата: по-прежнему "0 затронутых строк".
Итак, мои вопросы:
Я понимаю команды, верно? (что он не должен изменять строки)
Чем можно объяснить, что строки зависит в 1-м случае?
Редактировать
Я только что выяснил, что проблема не произойдет, если я удалить раздел.
С перегородкой я получаю "ХХХ затронутых строк"
Без раздела я получаю "0 затронутых строк"
Это ожидается?
Правка 2 с резюме
Изначально:
Стол был используя
latin1
в качестве кодировки по умолчанию (то же для столбцов)
Связь была заявлена как
utf8
Что работает:
Перед любой командой
ALTER TABLE
, символы, такие как "é", кажется
latin1
закодированных (
E9
)
Выполнив команду
ALTER TABLE mytable CHARACTER SET utf8mb4;
не изменять данные (в шестнадцатеричном команда по-прежнему показывает
E9
)
Колонна все-таки объявили
latin1
.
Выполнив команду
ALTER TABLE mytable MODIFY COL2 LONGTEXT CHARACTER SET utf8mb4
изменения столбце
utf8mb4
(
C3A9
)
До сих пор так хорошо.
Оставшиеся вопросы:
Как убедиться, что все данные в таблице
latin1
? Я пробовал
SELECT COL2 FROM mytable WHERE LENGTH(COL2) != CHAR_LENGTH(COL2) LIMIT 1
и я получил 0 результатов. Достаточно ли этого?
Почему команда
ALTER TABLE mytable CHARACTER SET utf8mb4;
показывает
"32141 затронутых строк", когда кажется, что данные не изменяются?
(это происходит, когда таблица разделов и индекс на одном и том же столбце)
Следуя предыдущему пункту, это безопасно (нужен?) чтобы изменить кодировку по умолчанию в таблице? Или я должен просто придерживаться внесении изменений в столбцы?
Спасибо большое за вашу помощь