如何在 MySQL 中将 BLOB 转换为 TEXT?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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】:

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

    在表中为每个 blob 列创建文本类型的新列 将所有 blob 转换为文本并将它们保存在新列中 删除 blob 列 将新列重命名为已删除列的名称
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

【讨论】:

以上是关于如何在 MySQL 中将 BLOB 转换为 TEXT?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中将 Blob 转换为文件

无法在 Spring 中将 MultipartFile 转换为 Blob

如何在硒 c# 中将 Blob 图像转换为位图图像

如何在 Azure 逻辑应用中将 blob 文件内容转换为 .docx

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel

DPFPApi 如何在 qt5 中将 data_blob 转换为 qpixmap