1

我的数据库中有一些 utf-8 字符串,它们存储为 varbinary。(通常,它是 mediawiki 数据库,但我认为这并不重要)。我发现有些琴弦的形状不好,然后我做

SELECT  log_comment, CONVERT( log_comment
USING utf8 ) AS 
COMMENT 
FROM  `logging` 
WHERE log_id = %somevalue%

我在 phpmyadmin 中有这样的输出表:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| d093d09ed0a1d0a220d0a020d098d0a1d09e2fd09cd0add09a20393239342d39332e20c2abd098d0bdd184d0bed180d0bcd0b0d186d0b8d0bed0bdd0bdd0b0d18f20d182d0b5d185d0bdd0bed0bbd0bed0b3d0b8d18f2e2e2e    |NULL |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我需要的是使这个字符串可读,或者上传带有正确数据的新字符串。但这是 varbinary 字段,我如何管理其中的数据?

UPD: 发现 phpmyadmin 自动为每行末尾的三个点添加 2e2e2e - 它们太长而无法显示。原始二进制数据是,如果有人感兴趣,

d09fd0a02035302e312e3031392d3230303020d09ed181d0bdd0bed0b2d0bdd18bd0b520d0bfd0bed0bbd0bed0b6d0b5d0bdd0b8d18f20d0b5d0b4d0b8d0bdd0bed0b920d181d0b8d181d182d0b5d0bcd18b20d0bad0bbd0b0d181d181d0b8d184d0b8d0bad0b0d186d0b8d0b820d0b820d0bad0bed0b4d0b8d180d0bed0b2d0b0d0bdd0b8d18f20d182d0b5d185d0bdd0b8d0bad0be2dd18dd0bad0bed0bdd0bed0bcd0b8d187d0b5d181d0bad0bed0b920d0b820d181d0bed186d0b8d0b0d0bbd18cd0bdd0bed0b920d0b8d0bdd184d0bed180d0bcd0b0d186d0b8d0b820d0b820d183d0bdd0b8d184d0b8d186d0b8d180d0bed0b2d0b0d0bdd0bdd18bd1

无论如何,这些字符串在行尾包含非 utf 符号,从

SELECT log_comment,CAST(log_comment AS CHAR CHARACTER SET utf8) AS COMMENT
FROM  `logging` 
WHERE log_id = %somevalue%

因为最后一个符号是 � - 对我来说,它似乎是黑色菱形,里面有白色问题,最后 20-30 个字符不见了

4

3 回答 3

2
SELECT log_comment,CAST(log_comment AS CHAR CHARACTER SET utf8) AS COMMENT
FROM  `logging` 
WHERE log_id = %somevalue%
于 2012-10-30T12:22:55.960 回答
1

正如 Joni 的评论中所说,

“文本的长度正好是255字节,这是MySQL tinytext/tinyblob字段的限制,也经常被程序员用作varchar/varbinary的大小。看起来你的原始数据被剪掉了。最后一个D1在您的原始数据中开始一个新的 UTF-8 字符,但缺少第二个字节;这就是转换后的文本中最后一个字符被破坏的原因。”

在 MediaWiki DB 中,表 [logging] 的 [log_comment] 字段中应存储已更改页面的标题。其中一些似乎超过 255 个符号,因此在记录时它们被剪掉了。这让我很困惑;我认为存在某种数据库错误,所以我应该只更改这些字符串 - 向它们添加缺少的符号。现在我发现这有点可能,所以我可以从其他领域收集必要的信息。

于 2013-03-06T14:00:10.223 回答
0

试试这个:

SELECT  log_comment, 
        CONVERT(log_comment,VARCHAR(65535)) AS COMMENT 
FROM  `logging` 
WHERE log_id = %somevalue%
于 2012-10-30T11:47:48.457 回答