【问题标题】:how to store and retrieve utf8 characters in mysql database through Node JS如何通过Node JS在mysql数据库中存储和检索utf8字符
【发布时间】:2026-02-13 18:45:02
【问题描述】:

我无法存储和检索“?”来自节点js中的mysql数据库。

  1. 数据库创建如下:
CREATE DATABASE PRODUCT CHARACTER SET UTF8mb4 COLLATE utf8mb4_bin;
  1. 表创建如下:
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';
  1. 在 aws 服务器上,我有一个创建数据库池的 lambda 函数,如下所示:
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'
});
  1. 我在数据库表中插入代码为:
const newQuestionEntry = `INSERT INTO QUESTIONS(USER_ID, QUESTION_TEXT) VALUES(` + userID + `,` + questionText + ',' + `)`;

  1. 所以对于一组值:USER_ID = 1 和 QUESTION_TEXT = "How are you?",存储在 Questions 表中的值如下: USER_ID = 1, QUESTION_TEXT = 你好吗 0

  2. '?'被“0”替换。

  3. 我还在我的数据库所在的 mysql 命令行中进行了以下检查:
select default_character_set_name from information_schema.SCHEMATA S where schema_name="PRODUCT";

确保字符集格式为utf8mb4。输出符合预期——utf8mb4

如何解决这个问题?我做错了什么?任何帮助将不胜感激。

【问题讨论】:

    标签: mysql amazon-web-services utf-8 aws-lambda character-encoding


    【解决方案1】:

    不要盲目地将问题插入到 INSERT 语句中,而是使用“绑定”。如果 PHP 在幕后,那么它有多种实现方式。

    另外,通过切换构建查询的方式,可以帮助避免“SQL注入”。

    ? 是一个占位符,用于在转义后插入字符串。通过提供

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

    然后绑定userIDquestionText,你会得到绑定和转义,同时避免你遇到的? 问题。

    【讨论】:

    • 非常感谢瑞克。绑定是这个问题的明确解决方案。