更正 mysql 语法以更改具有排序规则的列
Correct mysql syntax to change a column with collation
这行代码是由phpmyadmin自动生成的(可能是我公司网站上的旧版本运行,但我不想处理那个吧现在):
ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) CHARSET=latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
尝试执行 SQL 时,通过 phpmyadmin 获取错误消息:
Query error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to user near '=latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL' at line 1.
我没看出查询有什么问题,想知道有什么问题。
备注:
- 我所做的只是更改 VARCHAR 长度。
- 如果我删除该列,然后使用这些相同的设置重新创建它,效果很好。 ALTER TABLE 语法有问题。
- 我可以在同一个 table 中更改 INT 列(例如 INT 到 SMALLINT),没有任何问题。关于整理?但这是我们在整个数据库中使用的整理。
- mysql 版本:“5.5.47-0ubuntu0.14.04.1”
- 我对 VARCHAR 长度使用什么值并不重要。我尝试更改什么并不重要(例如,更改列名有相同的错误。)而且我之前在其他 tables 上遇到过这个问题。我从未能够成功地更改此数据库中的 VARCHAR,如果我指定排序规则。 (即使这是此数据库的默认排序规则,在我未指定排序规则时自动生成。)
问题出在 CHARSET/COLLATE 部分。如果我删除它,查询将起作用(使用数据库的默认字符集和排序规则):
ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) NULL DEFAULT NULL;
或等效的,稍微简单一点:
ALTER TABLE `lc_error_logs` MODIFY `OneDetailedMessage` VARCHAR(5000) NULL DEFAULT NULL;
注意:
我仍然不知道正确的语法是什么,或者这是否与数据库的设置方式有关。 因此,如果有人可以提供即使在排序规则规范下也有效的答案,我会接受该答案。否则,我会接受这个答案,然后继续。
ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
尝试使用 CHARACTER SET 而不是 CHARSET=
这行代码是由phpmyadmin自动生成的(可能是我公司网站上的旧版本运行,但我不想处理那个吧现在):
ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) CHARSET=latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
尝试执行 SQL 时,通过 phpmyadmin 获取错误消息:
Query error: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to user near '=latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL' at line 1.
我没看出查询有什么问题,想知道有什么问题。
备注:
- 我所做的只是更改 VARCHAR 长度。
- 如果我删除该列,然后使用这些相同的设置重新创建它,效果很好。 ALTER TABLE 语法有问题。
- 我可以在同一个 table 中更改 INT 列(例如 INT 到 SMALLINT),没有任何问题。关于整理?但这是我们在整个数据库中使用的整理。
- mysql 版本:“5.5.47-0ubuntu0.14.04.1”
- 我对 VARCHAR 长度使用什么值并不重要。我尝试更改什么并不重要(例如,更改列名有相同的错误。)而且我之前在其他 tables 上遇到过这个问题。我从未能够成功地更改此数据库中的 VARCHAR,如果我指定排序规则。 (即使这是此数据库的默认排序规则,在我未指定排序规则时自动生成。)
问题出在 CHARSET/COLLATE 部分。如果我删除它,查询将起作用(使用数据库的默认字符集和排序规则):
ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) NULL DEFAULT NULL;
或等效的,稍微简单一点:
ALTER TABLE `lc_error_logs` MODIFY `OneDetailedMessage` VARCHAR(5000) NULL DEFAULT NULL;
注意:
我仍然不知道正确的语法是什么,或者这是否与数据库的设置方式有关。 因此,如果有人可以提供即使在排序规则规范下也有效的答案,我会接受该答案。否则,我会接受这个答案,然后继续。
ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
尝试使用 CHARACTER SET 而不是 CHARSET=