mysqlimport 发出“set @@character_set_database=binary”,这会阻止加载 json 值

Posted

技术标签:

【中文标题】mysqlimport 发出“set @@character_set_database=binary”,这会阻止加载 json 值【英文标题】:mysqlimport issues "set @@character_set_database=binary" which prevents loading json values 【发布时间】:2016-07-10 18:03:19 【问题描述】:

我已经使用mysqlimport很长时间了,现在随着mysql 5.7添加了json数据类型支持,我正在尝试将mysqlimport与包含json数据的行一起使用。

以下是 csv 文件中将使用 mysqlimport 导入的行的示例:

column_A_value,column_B_value,["x":20,"y":"some name"]

请注意,最后一列类型是 json。现在使用mysqlimport时如下:

mysqlimport -u user -ppass -h localhost --columns='col_A,col_B,col_C' --local --fields-terminated-by=',' some_db /path/to/products.txt

我收到以下错误:Cannot create a JSON value from a string with CHARACTER SET 'binary'., when using table: products

但是使用生成的LOAD DATA IN FILE 而不是 mysqlimport 没有问题!我打开mysql日志,检查运行mysqlimport时生成的LOAD DATA IN FILE命令,然后复制粘贴,没有问题!我跑了类似的东西:

LOAD DATA LOCAL INFILE '/path/to/products.txt'
INTO TABLE products

它奏效了!唯一不同的是,在日志中,运行mysqlimport时也生成了这一行

Query   /*!40101 set @@character_set_database=binary */

然后生成了 LOAD DATA IN FILE 命令,因此该行是问题的根源。

所以无论如何我尝试将字符集设置为utf8,

mysqlimport -u user -ppass -h localhost --columns='col_A,col_B,col_C' --local --fields-terminated-by=',' --default-character-set=utf8 some_db /path/to/products.txt

但徒劳无功,发生了同样的错误。

请问有什么办法解决这个字符集问题吗?

【问题讨论】:

【参考方案1】:

检查您的字符集配置:

显示变量,如'%char%';

没有回复--default-character-set可能还是mysqlimport的一个bug: https://bugs.mysql.com/bug.php?id=29712

可能的解决方案:

    在导入前尝试SET NAMES utf8; 尝试使用mysql--default-character-set=utf8 而不是mysqlimport 更改您的my.cnf
[mysqld]
init-connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
default-character-set=utf8

[client]
default-character-set=utf8

【讨论】:

以上建议都不适合我。请注意,在 MYSQL 版本 5 或更高版本上,您需要使用不同的值来设置默认字符集,因为它们已弃用该字符集。此处的示例:outofcontrol.ca/blog/comments/… 使用mysql应该可以工作。至于my.cnfinit-connectdefault-character-set 似乎不再属于[mysqld] 部分。

以上是关于mysqlimport 发出“set @@character_set_database=binary”,这会阻止加载 json 值的主要内容,如果未能解决你的问题,请参考以下文章

mysqlimport命令

在文件名与表名不同的地方使用 mysqlimport

是否可以使用mysqlimport设置MySQL会话变量?

Linux基础命令---mysqlimport导入数据库

使用 mysqlimport 将 csv 文件导入 mysql 远程服务器

python set模块