Как вставить китайские иероглифы в базу данных MySQL из Node.js? - PullRequest
0 голосов
/ 15 марта 2020

Я нашел, в чем была проблема.

Дело в задержке. Проблема была в том, что мой ввод был быстрее, чем mysql сервер принял данные.

Поэтому я хочу закрыть этот вопрос и создать новый вопрос о том, как создать задержку в sql foreach.


Мне это кажется странным.

Сначала я ввожу следующий запрос в MySQL CLI:

INSERT INTO table1 VALUES (null, 女神在, now(), 0, 0);

Он работает нормально. Данные вставляются, как и ожидалось.

Затем я ввожу тот же запрос из Node.js MySQL скрипта.

app.get('/db', (req, res) => {
    let var1 = 'english word'
    let sql = 'INSERT INTO filelist VALUES (null, ?, ?, ?, ?)';
    let addeddate = 'now()';
    let isdeleted = '0';
    let ismodified = '0';
    let params = [var1, addeddate, isdeleted, ismodified];

    connection.query(sql, params,
        (err, rows, fields) => {
            if(err) {
                console.log(err);
            } else {
                res.send(rows);
                console.log(rows);
            }
        }
    )
    res.render('view');
})

Он тоже работает нормально, но если я изменю значение var1 на китайские буквы, я получаю следующую ошибку:

C:\Users\myapp\node_modules\mysql\lib\protocol\Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (C:\Users\myapp\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\Users\myapp\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\myapp\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (C:\Users\myapp\node_modules\express\lib\response.js:158:21)
    at Query.<anonymous> (C:\Users\myapp\app_file.js:166:21)
    at Query.<anonymous> (C:\Users\myapp\node_modules\mysql\lib\Connection.js:526:10)
    at Query._callback (C:\Users\myapp\node_modules\mysql\lib\Connection.js:488:16)
    at Query.Sequence.end (C:\Users\myapp\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (C:\Users\myapp\node_modules\mysql\lib\protocol\sequences\Query.js:149:8) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
Program node app_file.js exited with code 1

res.render в браузере полностью в порядке. даже если var1 является китайским.

Мой набор символов по умолчанию для БД и таблицы, конечно, 'utf8_general_ci'. Я тоже использовал util.format или utf8.encode, но получил ту же ошибку.


Я следовал Emoji не вставляются в базу данных node js mysql

И мне удалось ввести «Данные» в мою таблицу, но сообщение об ошибке все еще появляется.

Я попытался снова с «Массивом», что я и хотел, но это не удалось.


Я нашел show variables like 'c%'; в Google и набрал mysql cli.

character_set_client        utf8
character_set_connection    utf8
character_set_database      utf8
character_set_filesystem    binary
character_set_results   
character_set_server        latin1
character_set_system        utf8
character_sets_dir          /rdsdbbin/mysql-5.7.22.R5/share/charsets/
check_proxy_users           OFF
collation_connection        utf8_general_ci
collation_database          utf8_general_ci
collation_server            latin1_swedish_ci
completion_type             NO_CHAIN

кажется, что почти все части - utf8, но server - латинский.

это критично для меня? а то как это изменить?

1 Ответ

0 голосов
/ 15 марта 2020

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

При этом сказал, в то время как ваша среда базы данных utf-8, ваше приложение может не быть. Имея дело с OOP и подготовленными утверждениями, мы обычно определяем charset для нашего соединения, чтобы убедиться, что наши запросы et c. в правильных форматах.

Пример:

var connection = mysql.createConnection({
    host : 'your_ip',
    user : 'user',
    password : 'password',
    database : 'db',
    charset : 'utf8mb4'
});

Обязательно перезапустите сервер Node после этой реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...