MySQL Workbench не принимает файл JSON (ошибка 1290) - PullRequest
2 голосов
/ 29 января 2020

У меня есть набор тестов, который создает файл. json. Я хочу сохранить файл JSON в MYSQL. Мне все равно, как он его хранит. Я просто хочу, чтобы это было там, чтобы я мог вытащить это.

После изучения этого онлайн я попытался выполнить традиционный маршрут через GUI с помощью мастера импорта табличных данных:

Using the GUI

Я встретился со следующей ошибкой:

Meaningless error

Невозможно проанализировать файл. Пожалуйста, попробуйте изменить тип кодировки. Если это не помогает, возможно, файл не является: json, или файл пуст.

Файл явно не пустой, и файл действителен JSON. Я даже зашел так далеко, что поместил его в онлайн-инструмент, который проверяет JSON. Я посмотрел онлайн, и другие люди имели эту проблему. Поэтому я изменил кодировку для каждой опции, доступной в Notepad ++. К ним относятся:

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

Я снова получаю то же сообщение об ошибке. Поэтому я посмотрел на него как на хорошего пользователя переполнения стека, чтобы все не кричали на меня, и я вижу, что это было идентифицировано и подтверждено как ошибка в апреле 2019 года. Это было в 8.0. 15 корп. Я использую 8.0.19. Я не знаю, было ли это когда-либо решено, потому что мне нужна учетная запись Oracle для просмотра журналов прогресса (по какой-то удивительной необъяснимой причине).

Поэтому я выбрал альтернативный маршрут и просто попытался пробить запросы SQL прямо в My SQL Workbench. Большой сюрприз, он не работает:

errorAgain

Я получаю ошибку 1290, которая гласит:

Код ошибки: 1290. Сервер MySQL работает с параметром --secure-file-priv, поэтому он не может выполнить этот оператор.

I проверено переполнение стека и попробовал следующие решения:

  • комментирование - параметр secure-file-priv в связанном файле my.ini
  • с размещением json файл непосредственно в папку «uploads», которую - secure-file-priv указывает на
  • перезапуск MySQL / мой компьютер '

Нет это сработало. Он также предложил заменить "\" на "/" в пути к файлу на той же странице, но я не вижу, где вы его замените. Замена его в пути к файлу. json в запросе приводит к той же ошибке. Я не вижу, как бы вы заменили его на пути к исполняемому файлу, так как нет никакой возможности сделать это.

Прежде чем все начнут бросать вещи, вот некоторая базовая c информация, которую все просят:

  • Я использую Windows 10
  • Это MySQL Workbench 8.0.19
  • Используется MySQL Сервер 8.0

Если кто-то действительно знает, как это исправить, я был бы очень рад.

Я использую windows 10

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

Шаг 1: убедитесь, что у вас есть secure_file_priv набор параметров

mysql> select @@GLOBAL.secure_file_priv;
+----------------------------------+
| @@GLOBAL.secure_file_priv        |
+----------------------------------+
| /Users/demo/mysql/upload/ |
+----------------------------------+
1 row in set (0.00 sec)

Шаг 1a: Когда параметр secure_file_priv НЕ установлен

Редактировать /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'));

Шаг 4: Просмотр записей через select Запрос

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)
0 голосов
/ 07 февраля 2020

Вы столкнулись с двумя отдельными проблемами:

  • не удается импортировать файл в MySQL Workbench
  • не удается вручную импортировать

Фактический файл

Я знаю, что вы говорите, что ваш 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, создайте тестовый файл. json файл

'{}'

и еще один, например * 1048. *

{}

и протестируйте оба варианта. Мы знаем, что окончательное значение должно быть заключено в апострофы, но мы не знаем, сделает ли это для вас MySQL или Workbench. Поэтому вы должны стремиться понять, как это работает. Если импорт завершится успешно, вы сможете сравнить JSON с ним.

Workbench

Да, это ошибка, но она не обязательно применима здесь. Попробуйте использовать тестовые значения JSON, описанные в предыдущем разделе.

Защищенный файл priv

secure-file-priv ограничивает места, из которых можно импортировать файлы. Это хорошо, потому что позволяет защитить вашу базу данных, ограничивая доступ к пути доверенных пользователей, и гарантирует, что вы не получите импорт файлов, разбросанных по всему жесткому диску. Однако, поскольку эта опция включена, вам нужно будет проверить ее значение, как описал Виджаян Сиринивасан, и использовать это местоположение.

Подробнее здесь: Как мне решать --secure-file-priv в MySQL?

0 голосов
/ 01 февраля 2020

В MySql Workbench's 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"
    }
]
...