как хранить и получать символы utf8 в базе данных mysql через Node JS - PullRequest
0 голосов
/ 16 апреля 2020

Я не могу сохранить и получить '?' из базы данных mysql в node js.

  1. Создание базы данных выглядит следующим образом:
CREATE DATABASE PRODUCT CHARACTER SET UTF8mb4 COLLATE utf8mb4_bin;
Создание таблицы выглядит так:
CREATE TABLE QUESTIONS (
        QUESTION_ID BIGINT NOT NULL AUTO_INCREMENT,
        USER_ID BIGINT NOT NULL,
        QUESTION_TEXT NVARCHAR(300) NOT NULL,

        CREATED_AT TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        LAST_MODIFIED TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY (QUESTION_ID),
        FOREIGN KEY(USER_ID) REFERENCES USERS(USER_ID) ON DELETE CASCADE
    ) AUTO_INCREMENT=1 DEFAULT CHARSET='UTF8mb4';
На сервере aws у меня есть лямбда-функция, которая создает пул базы данных следующим образом:
let pool = mysql.createPool({
    connectionLimit: 10,
    host: config.rds_host,
    user: config.rds_user,
    password: config.rds_password,
    port: config.rds_port,
    database: config.rds_db,
    charset: 'utf8mb4'
});
Я вставляю код в таблицу базы данных как:
const newQuestionEntry = `INSERT INTO QUESTIONS(USER_ID, QUESTION_TEXT) VALUES(` + userID + `,` + questionText + ',' + `)`;

Таким образом, для набора значений: USER_ID = 1 и QUESTION_TEXT = "Как дела?", Значение, хранящееся в таблице вопросов, выглядит следующим образом: USER_ID = 1, QUESTION_TEXT = Как вы 0

'?' заменяется на '0'.

Я также сделал следующую проверку в командной строке mysql, в которой находится моя база данных:
select default_character_set_name from information_schema.SCHEMATA S where schema_name="PRODUCT";

, чтобы убедиться, что Формат charset - utf8mb4. Вывод был ожидаемым - utf8mb4

Как решить эту проблему? Что я делаю не так? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 19 апреля 2020

Вместо слепой интерполяции Вопроса в оператор INSERT используйте «связывание». Если PHP находится под прикрытием, то у него есть несколько способов достижения этого.

Кроме того, переключая способ построения запросов, вы можете избежать "SQL инъекция".

? - это заполнитель для вставки строки после ее экранирования. Предоставляя

INSERT INTO QUESTIONS(USER_ID, QUESTION_TEXT) VALUES(?, ?)

и затем связывая userID и questionText, вы получаете привязку и экранирование, избегая при этом проблемы ?, с которой вы столкнулись.

...