如何在 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
列上存储utf8
、USING 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?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Spring 中将 MultipartFile 转换为 Blob
如何在 Azure 逻辑应用中将 blob 文件内容转换为 .docx