我有一个测试套件,它生成一个.json文件。我想将JSON文件存储在MYSQL中。我不在乎它是怎么储存的。我只想把它放进去这样我就能把它拔出来。
在对此进行在线研究之后,我尝试使用通过GUI完成传统的路由:

我遇到了以下错误:

不能分析文件。请尝试更改编码类型。如果这没有帮助,那么文件可能不是: json,或者文件是空的。
文件显然不是空的,文件是有效的JSON。我甚至把它放到了一个验证JSON的在线工具中。我在网上看了看,其他人也有这个问题。因此,我将编码更改为Notepad++中可用的所有选项。其中包括:
同样,我仍然收到相同的错误消息。所以我把这个当做一个好的堆栈溢出用户,这样每个人都不会对我大喊大叫,我看到这是在2019年4月被确认为一种小虫。 --这是8.0.15版本中的。我正在使用8.0.19。我不知道是否已经解决了这个问题,因为我需要一个Oracle帐户来查看进度日志(原因很棒,原因不明)。
因此,我选择了另一条路线,尝试将SQL查询直接插入到我的SQL中。令人惊讶的是,这是行不通的:

我得到了错误1290,内容如下:
错误代码: 1290。MySQL服务器正在使用-安全文件-priv选项运行,因此它无法执行此语句.。
我检查堆栈溢出并尝试了以下解决方案:
这些都不管用。它还建议将同一页文件中的"\“替换为"/”,但我看不出您将在哪里替换它。将文件路径中的文件替换为查询中的.json文件会导致相同的错误。我不知道如何在可执行文件的路径上替换它,因为没有选项可以这样做。
在每个人开始扔东西之前,以下是一些每个人都想要的基本信息:
如果有人真的知道怎么解决这个问题,我会很高兴的。
我用的是windows 10
发布于 2020-02-02 03:05:18
secure_file_priv步骤1:确保您拥有参数集
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并添加以下行
<string>--secure-file-priv=/Users/demo/mysql/upload</string>在添加文件之后,应该如下所示
<?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 列创建表
CREATE TABLE `table1` (
`id` int NOT NULL AUTO_INCREMENT,
`json_data` text NOT NULL,
PRIMARY KEY (`id`)
) ;步骤3:使用TEXT LOAD_FILE 函数在列中插入值
insert into schema1.table1 (json_data)
values (LOAD_FILE('/Users/demo/mysql/upload/data.json'));select 第4步:通过查询查看记录
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)发布于 2020-02-01 19:35:08
在MySql Workbench的table data import wizard中,不仅需要传递array of json objects,下面的有效json就是有效条目的示例
[
{
"id": 1,
"name": "Aabir",
"type": "1",
},
{
"id": 2,
"name": "Ashish",
"type": "1",
},
{
"id": 3,
"name": "John",
"type": "1"
}
]发布于 2020-02-07 08:47:52
你们经历了两个不同的问题:
实际文件
我知道你说你的JSON是有效的,我相信你。但是,JSON是有效的这一事实并不意味着它可以按原样插入/更新。以这个JSON为例:
{
"test": "I'm valid"
}如果在验证器中运行此JSON,您将意识到这是有效的JSON。但是,您将无法将此值分配给MySQL中的文本字段,因为:
除此之外,我的例子中甚至有新行,这不应该是一个问题,但我也会看看换行符,如果我是你,看看可能有什么白色字符。
列
您打算放置JSON的实际列可能是一些text或json。文档在这里非常有用:https://dev.mysql.com/doc/refman/8.0/en/json.html
下面让我们看一个例子:
CREATE TABLE t1 (jdoc JSON);和
INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');您应该注意到,在插入时,实际的JSON包含在撇号中。这个
'{"key1": "value1", "key2": "value2"}'not是一个有效的JSON,但是可以插入它,因为如果我们将围绕该值的撇号放在一边,那么它就是一个有效的JSON。
因此,我建议在您试图了解如何插入JSON时,创建一个test.json文件
'{}'另一个类似的
{}用这两种方法进行测试。我们知道最终的值应该包含撇号,但是我们不知道MySQL或Workbench是为您做的。所以你应该努力理解它是如何工作的。如果导入成功,那么您将能够将您的JSON与它进行比较。
工作台
是的,这是一个bug,但它不一定适用于这里。尝试使用上一节中概述的测试JSON值。
安全文件priv
secure-file-priv限制可以从其中导入文件的位置。这是一件好事,因为它允许您通过限制对受信任用户的路径访问来保护您的数据库,并确保您不会以导入文件分散在硬盘驱动器中而告终。但是,由于该选项是打开的,您需要检查它的值,就像描述的那样,并使用该位置。
在这里阅读更多信息:我该如何处理MySQL中的安全文件?
https://stackoverflow.com/questions/59970639
复制相似问题