The character set MySQL calls utf8 stores at most three bytes per character, which excludes emoji and several CJK ranges — and the failure is a truncated string rather than an error.
SHOW CHARACTER SET LIKE 'utf8%';
-- utf8 UTF-8 Unicode utf8_general_ci 3
-- utf8mb4 UTF-8 Unicode utf8mb4_0900_ai_ci 4
ALTER TABLE comments
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
-- and every connection, or the client re-mangles it
-- SET NAMES utf8mb4;
Without strict mode the insert silently truncates at the offending character, which loses the rest of a customer’s message and reports success. The conversion is a table rewrite, so it belongs in the schema-change process rather than in a casual migration. Index key lengths change with it — a VARCHAR(255) unique index that fit under the old limit may not under the new one on older row formats, which is the failure that stops the ALTER halfway.