首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL工作台不接受JSON文件(错误1290)

问MySQL工作台不接受JSON文件(错误1290)
EN

Stack Overflow用户
提问于 2020-01-29 15:43:23
回答 3查看 4.1K关注 0票数 2

我有一个测试套件,它生成一个.json文件。我想将JSON文件存储在MYSQL中。我不在乎它是怎么储存的。我只想把它放进去这样我就能把它拔出来。

在对此进行在线研究之后,我尝试使用通过GUI完成传统的路由:

​

​

我遇到了以下错误:

​

​

不能分析文件。请尝试更改编码类型。如果这没有帮助,那么文件可能不是: json,或者文件是空的。

文件显然不是空的,文件是有效的JSON。我甚至把它放到了一个验证JSON的在线工具中。我在网上看了看,其他人也有这个问题。因此,我将编码更改为Notepad++中可用的所有选项。其中包括:

  • ANSI
  • UTF-8
  • UTF-8-BOM
  • UCS-2-BE-BOM
  • UCS-2-LE-BOM

同样,我仍然收到相同的错误消息。所以我把这个当做一个好的堆栈溢出用户,这样每个人都不会对我大喊大叫,我看到这是在2019年4月被确认为一种小虫。 --这是8.0.15版本中的。我正在使用8.0.19。我不知道是否已经解决了这个问题,因为我需要一个Oracle帐户来查看进度日志(原因很棒,原因不明)。

因此,我选择了另一条路线,尝试将SQL查询直接插入到我的SQL中。令人惊讶的是,这是行不通的:

​

​

我得到了错误1290,内容如下:

错误代码: 1290。MySQL服务器正在使用-安全文件-priv选项运行,因此它无法执行此语句.。

我检查堆栈溢出并尝试了以下解决方案:

  • 注释掉链接的my.ini文件中的-安全文件-priv设置
  • 将json文件直接放置到--安全文件-priv指向的“上载”文件夹中。
  • 重新启动MySQL /我的计算机

这些都不管用。它还建议将同一页文件中的"\“替换为"/”,但我看不出您将在哪里替换它。将文件路径中的文件替换为查询中的.json文件会导致相同的错误。我不知道如何在可执行文件的路径上替换它,因为没有选项可以这样做。

在每个人开始扔东西之前,以下是一些每个人都想要的基本信息:

  • 我在使用Windows 10
  • 这是MySQL Workbench 8.0.19
  • 这是使用MySQL服务器8.0

如果有人真的知道怎么解决这个问题,我会很高兴的。

我用的是windows 10

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-02 03:05:18

secure_file_priv步骤1:确保您拥有参数集

代码语言:javascript
复制
mysql> select @@GLOBAL.secure_file_priv;
+----------------------------------+
| @@GLOBAL.secure_file_priv        |
+----------------------------------+
| /Users/demo/mysql/upload/ |
+----------------------------------+
1 row in set (0.00 sec)

步骤1a:当参数未设置时

编辑/Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist并添加以下行

代码语言:javascript
复制
<string>--secure-file-priv=/Users/demo/mysql/upload</string>

在添加文件之后,应该如下所示

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>EnvironmentVariables</key>
    <dict>
        <key>MYSQLD_PARENT_PID</key>
        <string>1</string>
    </dict>
    <key>ExitTimeOut</key>
    <integer>600</integer>
    <key>GroupName</key>
    <string>_mysql</string>
    <key>KeepAlive</key>
    <dict>
        <key>AfterInitialDemand</key>
        <true/>
        <key>SuccessfulExit</key>
        <false/>
    </dict>
    <key>Label</key>
    <string>com.oracle.oss.mysql.mysqld</string>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>ProcessType</key>
    <string>Interactive</string>
    <key>Program</key>
    <string>/usr/local/mysql/bin/mysqld</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/mysql/bin/mysqld</string>
        <string>--basedir=/usr/local/mysql</string>
        <string>--datadir=/usr/local/mysql/data</string>
        <string>--plugin-dir=/usr/local/mysql/lib/plugin</string>
        <string>--early-plugin-load=keyring_file=keyring_file.so</string>
        <string>--keyring-file-data=/usr/local/mysql/keyring/keyring</string>
        <string>--log-error=/usr/local/mysql/data/mysqld.local.err</string>
        <string>--pid-file=/usr/local/mysql/data/mysqld.local.pid</string>
        <string>--user=_mysql</string>
        <!--Add this line-->
        <string>--secure-file-priv=/Users/demo/mysql/upload</string> 
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>SessionCreate</key>
    <true/>
    <key>UserName</key>
    <string>_mysql</string>
    <key>WorkingDirectory</key>
    <string>/usr/local/mysql</string>
</dict>
</plist>

步骤2:使用TEXT 列创建表

代码语言:javascript
复制
CREATE TABLE `table1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `json_data` text NOT NULL,
  PRIMARY KEY (`id`)
) ;

步骤3:使用TEXT LOAD_FILE 函数在列中插入值

代码语言:javascript
复制
insert into schema1.table1 (json_data) 
values (LOAD_FILE('/Users/demo/mysql/upload/data.json'));

select 第4步:通过查询查看记录

代码语言:javascript
复制
mysql> select * from schema1.table1;
+----+-------------------------------------------------------------+
| id | json_data                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+----+-------------------------------------------------------------+
|  1 | [
    {
        "id": 1,
        "name": "Vijayan Srinivasan",
        "place": "Bangalore"
    },
    {
        "id": 2,
        "name": "Vijayan Srinivasan",
        "place": "Chennai"
    },
    {
        "id": 3,
        "name": "Vijayan Srinivasan",
        "place": "Delhi"
    },
    {
        "id": 4,
        "name": "Vijayan Srinivasan",
        "place": "Mangalore"
    },
    {
        "id": 5,
        "name": "Vijayan Srinivasan",
        "place": "Mumbai"
    }
] |
+----+-------------------------------------------------------------+
1 row in set (0.00 sec)
票数 2
EN

Stack Overflow用户

发布于 2020-02-01 19:35:08

在MySql Workbench的table data import wizard中,不仅需要传递array of json objects,下面的有效json就是有效条目的示例

代码语言:javascript
复制
[
    {
        "id": 1,
        "name": "Aabir",
        "type": "1",
    },
    {
        "id": 2,
        "name": "Ashish",
        "type": "1",
    },
    {
        "id": 3,
        "name": "John",
        "type": "1"
    }
]
票数 0
EN

Stack Overflow用户

发布于 2020-02-07 08:47:52

你们经历了两个不同的问题:

  • 无法在MySQL工作台中导入文件
  • 无法手动导入

实际文件

我知道你说你的JSON是有效的,我相信你。但是,JSON是有效的这一事实并不意味着它可以按原样插入/更新。以这个JSON为例:

代码语言:javascript
复制
{
    "test": "I'm valid"
}

如果在验证器中运行此JSON,您将意识到这是有效的JSON。但是,您将无法将此值分配给MySQL中的文本字段,因为:

  • 它不包含在撇号中。
  • 它里面有一个未转义的撇号。

除此之外,我的例子中甚至有新行,这不应该是一个问题,但我也会看看换行符,如果我是你,看看可能有什么白色字符。

列

您打算放置JSON的实际列可能是一些text或json。文档在这里非常有用:https://dev.mysql.com/doc/refman/8.0/en/json.html

下面让我们看一个例子:

代码语言:javascript
复制
CREATE TABLE t1 (jdoc JSON);

和

代码语言:javascript
复制
INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');

您应该注意到,在插入时,实际的JSON包含在撇号中。这个

代码语言:javascript
复制
'{"key1": "value1", "key2": "value2"}'

not是一个有效的JSON,但是可以插入它,因为如果我们将围绕该值的撇号放在一边,那么它就是一个有效的JSON。

因此,我建议在您试图了解如何插入JSON时,创建一个test.json文件

代码语言:javascript
复制
'{}'

另一个类似的

代码语言:javascript
复制
{}

用这两种方法进行测试。我们知道最终的值应该包含撇号,但是我们不知道MySQL或Workbench是为您做的。所以你应该努力理解它是如何工作的。如果导入成功,那么您将能够将您的JSON与它进行比较。

工作台

是的,这是一个bug,但它不一定适用于这里。尝试使用上一节中概述的测试JSON值。

安全文件priv

secure-file-priv限制可以从其中导入文件的位置。这是一件好事,因为它允许您通过限制对受信任用户的路径访问来保护您的数据库,并确保您不会以导入文件分散在硬盘驱动器中而告终。但是,由于该选项是打开的,您需要检查它的值,就像描述的那样,并使用该位置。

在这里阅读更多信息:我该如何处理MySQL中的安全文件?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59970639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档