【问题标题】:Correct mysql syntax to change a column with collation更正 mysql 语法以使用排序规则更改列
【发布时间】:2017-01-26 19:46:17
【问题描述】:

这行代码是 phpmyadmin 自动生成的(可能是我公司网站上运行的旧版本,但我现在不想处理):

ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) CHARSET=latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;

尝试执行该 SQL 时,通过 phpmyadmin 获取错误消息:

查询错误: #1064 - 您的 SQL 语法有错误;检查与您的 MYSQL 服务器版本相对应的手册,在第 1 行的 '=latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL' 附近为用户找到正确的语法。

我看不出查询出了什么问题,我想知道问题出在哪里。

注意事项:

  1. 我所做的只是更改 VARCHAR 长度。
  2. 如果我删除该列,然后使用这些相同的设置重新创建它,则可以正常工作。只是那个 ALTER TABLE 语法有问题。
  3. 我可以更改同一个表中的 INT 列(例如 INT 到 SMALLINT),没有任何问题。关于 COLLATE 的东西?但这是我们在整个数据库中使用的整理。
  4. mysql 版本:“5.5.47-0ubuntu0.14.04.1”
  5. VARCHAR 长度使用什么值并不重要。我尝试更改什么并不重要(例如,更改列名有相同的错误。)而且我之前在其他表上遇到过这个问题。 如果我指定排序规则,我从未能够成功地更改此数据库中的 VARCHAR。 (尽管这是此数据库的默认排序规则,但在我未指定排序规则时会自动生成。)

【问题讨论】:

    标签: mysql alter-table


    【解决方案1】:
    ALTER TABLE `lc_error_logs` CHANGE `OneDetailedMessage` `OneDetailedMessage` VARCHAR(5000) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
    

    尝试使用 CHARACTER SET 而不是 CHARSET=

    【讨论】:

    • 谢谢。这就是我需要知道的。具体来说,= 标志不应该在那里。 (CHARSET 是 CHARACTER SET 的有效同义词,所以这部分没问题)。
    【解决方案2】:

    问题出在 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;
    

    注意:

    我仍然不知道正确的语法是什么,或者这是否与数据库的设置方式有关。 因此,如果有人可以提供即使有排序规则也可以使用的答案,我会接受该答案。否则,我会接受这个答案,然后继续。

    【讨论】:

    • 注意:48 小时内我无法接受自己的答案。如果您在那之后阅读本文,我很抱歉,我忘记了回去接受答案。
    猜你喜欢
    • 2011-02-13
    • 2015-04-03
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2012-06-10
    • 2017-06-05
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多