首页 > 解决方案 > 更改 mySQL 中的字符集时出错?

问题描述

我正在尝试将 mySQL 数据库(版本 5.6.45)中的一个字段从 utf8 更改为 utf8mb4,以便能够发布表情符号。

这就是我正在做的事情:

ALTER TABLE contenidos CHANGE COLUMN titulo varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

但我也尝试过(结果相同),这个:

ALTER TABLE contenidos CHANGE COLUMN titulo CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

ALTER TABLE contenidos CHANGE COLUMN titulo varchar(500) CHARACTER SET utf8mb4;

我不断收到此错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用

在第 3 行的“CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci”附近

如果我从 phpmyadmin 更改排序规则,我可以做到,但它似乎不起作用,因为表情符号不是数据库中的保护程序。所以我想我也应该改变字符集。

标签: mysqlcharacter-encoding

解决方案


在此处查看 ALTER TABLE 的语法:https ://dev.mysql.com/doc/refman/5.6/en/alter-table.html

如果您使用 CHANGE COLUMN,则使用该列的当前名称,然后您必须重新命名该列,即使您没有更改名称。

ALTER TABLE contenidos CHANGE COLUMN titulo 
  titulo varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

原因是 CHANGE COLUMN 允许您更改列名。如果您想这样做,您可以命名要更改的列,然后是新名称。

ALTER TABLE contenidos CHANGE COLUMN <old_name> <new_name> <data-type> ...

CHANGE COLUMN 的语法要求您提供两个名称,即使它们相同。

替代方案:使用 MODIFY COLUMN,它不允许更改列名,但允许更改其他列属性,包括字符集。所以你只需要列出一次列名。

ALTER TABLE contenidos MODIFY COLUMN titulo 
  varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

顺便说一句,每个排序规则仅适用于一个字符集,因此您无需同时指定两者。通过指定排序规则,这将在必要时隐式更改字符集。

ALTER TABLE contenidos MODIFY COLUMN titulo 
  varchar(500) COLLATE utf8mb4_general_ci;

推荐阅读