【问题标题】:Trying To Change MYSQL's Table Field Type From BLOB to JSON尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON
【发布时间】:2017-07-07 18:14:48
【问题描述】:

尝试为 MySql 数据库运行语句时,我不断收到错误消息。我想要做的是将列名的类型从 BLOB 更改为 JSON。

声明如下:

ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON CHARACTER SET 'utf8mb4' NULL DEFAULT NULL ;

这是工作台自动为我创建的东西,当我运行它时...我收到此错误:

Operation failed: There was an error while applying the SQL script to the database.
Executing:
ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON CHARACTER SET 'utf8mb4' NULL DEFAULT NULL ;

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 use near 'CHARACTER SET 'utf8mb4' NULL DEFAULT NULL' at line 2
SQL Statement:
ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON CHARACTER SET 'utf8mb4' NULL DEFAULT NULL

任何帮助将不胜感激。

谢谢:)

【问题讨论】:

  • this SO 问题可能重复?
  • 不,那没有回答我的问题。如果我从该答案运行语句,则会收到另一个错误:
    错误 3144:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值。 SQL 语句:ALTER TABLE main_db.main_table MODIFY name JSON

标签: php mysql json database blob


【解决方案1】:

尽量简化命令,去掉你不改变的部分:

ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON;

【讨论】:

  • 我试过了,问题是这个错误:错误 3144:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值。 SQL 语句:ALTER TABLE main_db.main_table CHANGE COLUMN name name JSON
  • 听上去好像表格被填满了,现有数据无法转换。您可能必须创建一个新表,并编写一个查询来复制数据,并显式转换 JSON 数据。
  • 你是最棒的。在我清理完桌子后它起作用了。谢谢
  • 如何从 blob 显式转换为 json?我遇到了同样的错误无法从带有 CHARACTER SET 'binary' 的字符串创建 JSON 值。
  • @SathiyaVasagamS,请参阅下面大卫的回答。您可能需要分多个步骤来完成。
【解决方案2】:

如何通过 TEXT 分两步将列转换为 JSON?

ALTER TABLE `main_db`.`main_table` MODIFY `name` TEXT;
ALTER TABLE `main_db`.`main_table` MODIFY `name` JSON;

使用MODIFY instead of CHANGE,因为您不需要重命名该列。

【讨论】:

    【解决方案3】:

    这就是我所做的,显式转换、删除旧列并重命名临时列:

    alter table testjson add jdata json;
    update testjson set jdata = cast(convert(cast(xdata as char(999999)) using utf8) as json);
    alter table testjson drop column xdata;
    alter table testjson change column jdata xdata json;
    

    这里值得注意的是 LOAD..INFILE 中有一个相关的技巧:

    LOAD DATA LOCAL INFILE "/tmp/another.csv" INTO TABLE another(@hid, @htype, @bindata) set id=unhex(@hid), type=unhex(@htype), jdata=cast(convert(cast(@bindata as char(999999)) using utf8) as json);
    

    【讨论】:

      【解决方案4】:

      要获取现有数据,您需要创建一个新的 json 格式的临时列。 通过将 blob 列中的数据转换为字符串类型,将其复制到 temp 列中。

      update main_db set temp = CAST(name AS CHAR(100000));
      

      现在重命名两列,您将取回现有数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多