我如何从BLOB转换为文本在MySQL?

我有很多记录,其中文本被存储在MySQL中的blob中。为了方便处理,我想改变数据库的格式为文本…有什么想法可以轻松地进行更改,从而不中断数据-我猜它将需要正确编码?

451607 次浏览

下面是一个一个人的例子,它想用utf - 8编码将一个blob转换为char(1000):

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

这是他的答案。关于CAST 在这里,你可能可以读到更多的东西。我希望这能有所帮助。

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

或者你可以使用这个函数:

DELIMITER $$


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




DELIMITER ;

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

  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;

你可以很容易地做到。

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

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

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

截图

这些答案对我都没用。当转换为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中检查二进制值。右击字段->在查看器中打开值->二进制。当转换回二进制时,二进制值应该与原始值相同。

或者,你也可以使用base-64,这是为了这个目的:

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

使用phpMyAdmin你也可以设置选项来显示BLOB内容和显示完整的文本。

SELECCT TO_BASE64(blobfield)
FROM the Table

为我工作。

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

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

解决了它
select
uncompress(blobfield)
from table

我不明白为什么不那么容易:

UUID_TO_BIN('77dea2ad-3c8c-40c6-a278-7cf1a1ac9384')

而且

BIN_TO_UUID(FIELD)