【问题标题】:Issue on Mysql UTF8 data import with Sqoop使用 Sqoop 导入 Mysql UTF8 数据的问题
【发布时间】:2017-09-13 22:48:41
【问题描述】:

我正在使用 sqoop 导入将 utf8 数据从 MySql 导入到 HDFS。 它工作正常,但当数据为 utf-8 时面临问题。 源 MySql 表与 utf-8 兼容,但看起来 sqoop 在导入期间正在转换数据。 示例 - 源值 - л.с。加载为 л.Ñ。到 HDFS。

目前,Mysql (v5.6.10) 字符集和排序规则如下:

+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | latin1                                  |
| character_set_connection | latin1                                  |
| character_set_database   | latin1                                  |
| character_set_filesystem | binary                                  |
| character_set_results    | latin1                                  |
| character_set_server     | utf8                                    |
| character_set_system     | utf8                                    |
| collation_connection     | latin1_swedish_ci                       |
| collation_database       | latin1_swedish_ci                       |
| collation_server         | utf8_unicode_ci                         |
+--------------------------+-----------------------------------------+

-- Table Structure
CREATE TABLE utf_test_cases_ms 
(
  test_case varchar(50) NOT NULL,
  english_lang varchar(250) NOT NULL,
  language_name varchar(50) NOT NULL,
  utf8_lang varchar(300) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

-- Mysql
select * from utf_test_cases_ms;
+--------------------+--------------+---------------+-----------+
| test_case          | english_lang | language_name | utf8_lang |
+--------------------+--------------+---------------+-----------+
| Multiple Character | hp           | Russian       | л.с.    |
+--------------------+--------------+---------------+-----------+

-- Sqoop Import Command
sqoop import --connect jdbc:mysql://<<IP_ADDRESS_WITH_PORT>>/<<DB_NAME>> 
--table utfmb_test_cases_ms --username sqoop_user --password sqoop_pwd 
--hive-import --hive-table utf_ms_db.utfmb_test_cases_ms 
--create-hive-table --null-string '\\N' --null-non-string '\\N'  
--fields-terminated-by '|'  --lines-terminated-by '\n' -m 1 

-- Hive (HDFS)
select * from utfmb_test_cases_ms;
Multiple Character  hp  Russian л.Ñ.

我需要更改 Mysql 配置文件中的字符集和排序规则吗?通过 sqoop 导入数据时是否需要传递额外的 unicode / utf8 参数?

请为此提供解决方案。 提前致谢!

(来自评论)

CREATE TABLE utf_test_cases_ms (
    test_case varchar(50) NOT NULL, 
    english_lang varchar(250) NOT NULL, 
    language_name varchar(50) NOT NULL, 
    utf8_lang varchar(300) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 

【问题讨论】:

    标签: mysql utf-8 sqoop


    【解决方案1】:

    在 sqoop 命令中传递字符集参数

    sqoop import --connect jdbc:mysql://server.foo.com/db --table bar \
    --direct -- --default-character-set=latin1
    

    【讨论】:

    • 尝试使用“default-character-set=latin1”但不工作。
    【解决方案2】:

    也许@marjun 的建议应该涉及utf8?

    无论如何,л.с.л.Ñ. 出现是“Mojibake”,正如在 http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored

    请提供SHOW CREATE TABLE,以便我们验证设置是否正确。

    如果连接参数不起作用,请使用SET NAMES utf8

    【讨论】:

    • SHOW CREATE TABLE utf_test_cases_ms for UTF8 in MySQL CREATE TABLE utf_test_cases_ms ( test_case varchar(50) NOT NULL, english_lang varchar(250) NOT NULL, language_name varchar(50) NOT NULL, utf8_lang varchar(300) NOT NULL ) 引擎=MyISAM 默认字符集=utf8 ;尝试使用 SET NAMES utf8,但问题仍然存在。
    • л.с. 不能是latin1;你必须告诉 MySQL 你的数据是 utf8。 SET NAMES必须在连接之后和INSERTing之前执行。
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 2015-11-17
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多