【问题标题】:MySQL blob dump to tab delimited filesMySQL blob 转储到制表符分隔文件
【发布时间】:2011-03-04 07:01:09
【问题描述】:

我正在 Amazon 的 EC2 中迁移 MySQL 5.1 数据库,并且我遇到了我们用于图像存储的 longblob 数据类型的问题表。基本上迁移后longblob列的数据大小不一样了,因为字符编码好像不一样。

首先,这里是一个迁移前后的例子:

旧:

x??]]??}?_ѕ??d??i|w?%?????q$??+?

新:

x��]]����_ѕ��d��i|w�%�����q$��+�

我检查了两台机器上的字符集变量,它们是相同的。我还检查了“显示创建表”,它们也是相同的。客户端的连接方式相同(没有 SET NAMES,或指定字符集)。

这是我使用的 mysqldump 命令(我也尝试过不使用 --hex-blob):

mysqldump --hex-blob --default-character-set=utf8 --tab=. DB_NAME

这是我加载数据的方式:

mysql DB_NAME --default-character-set=utf8 -e "LOAD DATA INFILE 'EXAMPLE.txt' INTO TABLE EXAMPLE;"

这里是 MySQL 字符集变量(相同):

旧:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

新:

+--------------------------+----------------------------+    
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

我不确定还有什么方法可以运行 mysqldump 并使两台机器上的 blob 数据相同。任何提示将不胜感激。

【问题讨论】:

    标签: mysql set blob character mysqldump


    【解决方案1】:

    这个问题似乎是 mysql 中的一个错误 (http://bugs.mysql.com/bug.php?id=27724)。解决方案是不使用 mysqldump,而是为具有 blob 数据的表编写自己的 SELECT INTO OUTFILE 脚本。这是一个例子:

    SELECT
    COALESCE(column1, @nullval), 
    COALESCE(column2, @nullval), 
    COALESCE(HEX(column3), @nullval), 
    COALESCE(column4, @nullval), 
    COALESCE(column5, @nullval)
    FROM table
    INTO OUTFILE '/mnt/dump/table.txt' 
    FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
    

    加载数据:

    SET NAMES utf8;
    LOAD DATA INFILE '/mnt/dump/table.txt'
    INTO TABLE table
    FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
    (column1, column1, @column1, column1, column1)
    SET data = UNHEX(@column1)
    

    这会正确加载 blob 数据。

    【讨论】:

    • 非常感谢,它帮助我找到了解决问题的方法,即用 php 编写一个包含二进制数据的文件,然后使用 LOAD DATA INFILE 加载它。我在 PHP 中使用 bin2hex 和 hex2bin,它正在工作!
    • 很高兴为您提供帮助。这花了我好几个小时才最终弄清楚,所以我希望它可以为您节省一些时间。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多