【问题标题】:How do I convert from BLOB to TEXT in MySQL?如何在 MySQL 中将 BLOB 转换为 TEXT?
【发布时间】:2010-10-31 04:41:35
【问题描述】:

我有很多记录,其中文本存储在 MySQL 的 blob 中。为了便于处理,我想将数据库中的格式更改为 TEXT...任何想法如何轻松地进行更改以免中断数据 - 我想它需要正确编码?

【问题讨论】:

    标签: sql mysql blobs


    【解决方案1】:

    那是不必要的。只需使用SELECT CONVERT(column USING utf8) FROM..... 而不仅仅是SELECT column FROM...

    【讨论】:

    • 用法:SELECT CONVERT(column USING utf8) FROM table;
    • 这对于那些将你的输出转换为 blob 并且你真的希望它们作为字符串的 GROUP_CONCAT 非常有用。在将 Node.JS 与 node-mysql 库一起使用时,我遇到了类似于 OP 的问题 - 这解决了所有 group_concat 问题。
    • 这项工作,也可以与 CONVERT(LEFT(MD5([ID]),8) USING utf8) 等热查询一起使用
    • 这行不通。 charset需要是utf16,否则遇到无法转成utf8的一组字节会导致数据丢失。它将用 ? 替换这些字节导致数据丢失的字符。
    • CONVERT(column USING utf8) 将返回一个名为 CONVERT(...) 的列。如果想避免这种情况,请不要忘记使用CONVERT(column USING utf8) AS column。这会将列重命名为column
    【解决方案2】:

    这是一个 a person 的示例,他希望使用 UTF-8 编码将 blob 转换为 char(1000):

    CAST(a.ar_options AS CHAR(10000) CHARACTER SET utf8)
    

    这是他的答案。关于 CAST right here,您可能还可以阅读更多内容。希望对大家有所帮助。

    【讨论】:

    • 不幸的是,这对我不起作用。我得到空行,有时只有一个带有奇怪符号的 1 字符输出。
    • 也在选择查询中工作,选择 A.id,CAST(B.content AS CHAR(10000) CHARACTER SET utf8) 作为内容,Bb from A join B ON B.content_id=A.content_id
    【解决方案3】:

    我也遇到了同样的问题,下面是我的解决方案:

    1. 在表中为每个 blob 列创建文本类型的新列
    2. 将所有 blob 转换为文本并将它们保存在新列中
    3. 删除 blob 列
    4. 将新列重命名为已删除列的名称
    ALTER TABLE mytable
    ADD COLUMN field1_new TEXT NOT NULL,
    ADD COLUMN field2_new TEXT NOT NULL;
    
    update mytable set
    field1_new = CONVERT(field1 USING utf8),
    field2_new = CONVERT(field2 USING utf8);
    
    alter table mytable
    drop column field1,
    drop column field2;
    
    alter table mytable
    change column field1_new field1 text,
    change column field2_new field2 text;
    

    【讨论】:

    • 这是唯一对我有用的答案,谢谢:)
    • 中间列成功了。通过所有其他方法和答案不断收到错误引用坏字符。谢谢
    【解决方案4】:

    如果您使用的是MYSQL-WORKBENCH,那么您可以正常选择blob列并右键单击列并单击在编辑器中打开值。参考截图:

    【讨论】:

    • 仅供参考:(这样人们就不必点击上面的图片来查看它的作用):这一次显示一个值 - 并不能解决查看文本的愿望所有行中的列。
    【解决方案5】:

    你可以很容易地做到这一点。

    ALTER TABLE `table_name` CHANGE COLUMN `column_name` `column_name` LONGTEXT NULL DEFAULT NULL ;
    

    上面的查询对我有用。希望对你也有帮助。

    【讨论】:

      【解决方案6】:

      这些答案都不适合我。转换为 UTF8 时,当编码器遇到无法转换为 UTF8 的一组字节时,会导致 ?替换导致数据丢失。您需要使用 UTF16:

      SELECT
          blobfield,
          CONVERT(blobfield USING utf16),
          CONVERT(CONVERT(blobfield USING utf16), BINARY),
          CAST(blobfield  AS CHAR(10000) CHARACTER SET utf16),
          CAST(CAST(blobfield  AS CHAR(10000) CHARACTER SET utf16) AS BINARY)
      

      您可以在 MySQL Workbench 中检查二进制值。右键单击该字段 -> 在查看器中打开值 -> 二进制。转换回 BINARY 时,二进制值应与原始值相同。

      或者,您可以只使用为此目的而制作的 base-64:

      SELECT
          blobfield,
          TO_BASE64(blobfield),
          FROM_BASE64(TO_BASE64(blobfield))
      

      【讨论】:

      • 注意:TO_BASE64 的目的与原始帖子的问题 (OP) 不同。 OP“知道”他们已将 text 存储到 blob 字段中,并希望将该文本视为文本。 (为此,转换为 utf16 是合适的 - 如果文本最初位于 utf16)。 TO_BASE64 是一种使用可见字符显示任意 blob 的方法。它使用一组 64 个字符扩展原始字节。
      • 更多:如果数据最初位于 utf8 中(来自任何来源,然后写入 blob),utf16做你想做的事- 您需要“知道”原始文本的格式,并在USING 子句中使用它。例如,我的常规日志表argument 列上存储utf8USING utf16 的查询,产生一系列亚洲字符,用于SHOW SESSION VARIABLES 等简单查询。就我而言,USING utf8 是正确答案。
      【解决方案7】:

      使用 phpMyAdmin,您还可以设置显示 BLOB 内容和显示完整文本的选项。

      【讨论】:

      • 究竟有人会怎么做呢?如果您发布一些详细说明此类的代码和/或屏幕截图,您的答案会更有帮助。
      【解决方案8】:

      或者你可以使用这个功能:

      DELIMITER $$
      
      CREATE FUNCTION BLOB2TXT (blobfield VARCHAR(255)) RETURNS longtext
      DETERMINISTIC
      NO SQL
      BEGIN
             RETURN CAST(blobfield AS CHAR(10000) CHARACTER SET utf8);
      END
      $$
      
      
      DELIMITER ;
      

      【讨论】:

        【解决方案9】:
        SELECCT TO_BASE64(blobfield)  
        FROM the Table
        

        为我工作。

        CAST(blobfield AS CHAR(10000) CHARACTER SET utf8) 和 CAST(blobfield AS CHAR(10000) CHARACTER SET utf16) 没有显示我想要获取的文本值。

        【讨论】:

          【解决方案10】:

          我的 MariaDB 记录也有同样的问题。 (由我的同事)使用

          解决了这个问题
          select
          uncompress(blobfield)
          from table
          

          【讨论】:

            猜你喜欢
            • 2022-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-03
            • 2015-03-12
            • 2014-12-20
            • 2013-01-04
            • 2020-11-10
            相关资源
            最近更新 更多