【发布时间】:2010-10-31 04:41:35
【问题描述】:
我有很多记录,其中文本存储在 MySQL 的 blob 中。为了便于处理,我想将数据库中的格式更改为 TEXT...任何想法如何轻松地进行更改以免中断数据 - 我想它需要正确编码?
【问题讨论】:
我有很多记录,其中文本存储在 MySQL 的 blob 中。为了便于处理,我想将数据库中的格式更改为 TEXT...任何想法如何轻松地进行更改以免中断数据 - 我想它需要正确编码?
【问题讨论】:
那是不必要的。只需使用SELECT CONVERT(column USING utf8) FROM..... 而不仅仅是SELECT column FROM...
【讨论】:
SELECT CONVERT(column USING utf8) FROM table;
CONVERT(column USING utf8) 将返回一个名为 CONVERT(...) 的列。如果想避免这种情况,请不要忘记使用CONVERT(column USING utf8) AS column。这会将列重命名为column。
这是一个 a person 的示例,他希望使用 UTF-8 编码将 blob 转换为 char(1000):
CAST(a.ar_options AS CHAR(10000) CHARACTER SET utf8)
这是他的答案。关于 CAST right here,您可能还可以阅读更多内容。希望对大家有所帮助。
【讨论】:
我也遇到了同样的问题,下面是我的解决方案:
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 ;
上面的查询对我有用。希望对你也有帮助。
【讨论】:
这些答案都不适合我。转换为 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 是正确答案。
或者你可以使用这个功能:
DELIMITER $$
CREATE FUNCTION BLOB2TXT (blobfield VARCHAR(255)) RETURNS longtext
DETERMINISTIC
NO SQL
BEGIN
RETURN CAST(blobfield AS CHAR(10000) CHARACTER SET utf8);
END
$$
DELIMITER ;
【讨论】:
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
【讨论】: