【问题标题】:Queries from NodeJS to PostgreSQL DB doesn't properly show UTF8 characters从 NodeJS 到 PostgreSQL DB 的查询不能正确显示 UTF8 字符
【发布时间】:2021-01-21 00:03:58
【问题描述】:

我正在做一个项目,我的母语是西班牙语,在我的数据库中,我使用诸如“ñ”和“é”之类的字符。当我使用 psql shell 时,这些字符正确显示在终端上,但是当我使用 node-postgress 进行查询时,这些字符没有显示出来,而是得到 ¤ 或 ¢。

在我的数据库中,我将 client_encoding 和 server_encoding 都设置为 UTF8,我什至使用查询检查了 node-postgress,以查看它们是否也设置为 UTF8,并且由于其他原因它们没有更改。

p>

我的数据库连接是这样设置的

const { Pool } = require("pg");

const db = new Pool({
  user: user,
  password: password,
  host: localhost,
  port: 5432,
  database: my_database,
});

module.exports = db;

我的查询代码是这样的:

const router = require("express").Router(),
  db = require("../database/db");

//GET A PLACE ROUTE
router.get("/", async (req, res) => {
  try {
    const place = await db.query("SELECT * FROM places");
    console.log(place.rows[0].name);
    res.status(200).json({
      status: "success",
      data: {
        place_name: place.rows[0].name,
      },
    });
  } catch (error) {
    console.error(error.message);
    res.status(500).send("Error del servidor");
  }
});

现在,如果该地点的名称是“Salón de peñas”,那么它将如何显示在 console.log 和我的 json 响应中,就像“Sal¢n de pe¤as”一样。

起初,我认为问题是因为我没有正确设置我的 json 响应字符集,但后来我将这些字符作为响应发送,并且它们正确显示。问题是当这些字符来自我的数据库时。我检查了数据库编码(客户端和服务器),它们都设置为 UTF8,就像我之前说的,当我使用 psql shell 时,这些字符可以正确显示。

我基本上遇到了与this 没有得到答案的问题完全相同的问题

【问题讨论】:

    标签: node.js postgresql express utf-8 node-postgres


    【解决方案1】:

    我想我找到了解决这个问题的方法,可能很难解释,但我会尽力而为。

    所以,我意识到例如一个新用户注册,他们的名字中有ñ或ó,在数据库中它显示为├▒和├│。但是,如果我从服务器进行查询并发送 json 响应,“├▒”“├│”字符消失,而“ñ”“ó”显示。

    由于这种奇怪的行为,我想通过我的后端将我的所有位置插入数据库,而不是使用 psql shell 插入它。这真的很烦人,因为我需要创建一个路由来将数据插入到我的位置表中,然后使用邮递员对我需要插入的每一行进行发布请求,然后删除该发布路由,因为我真的没有需要它。

    在那之后,我意识到可能使用 psql shell 中的 \i 命令(执行 .sql 文件的命令)可能会导致类似的行为,例如使用 post 请求从服务器插入数据。它做到了!所以现在,我有一个 database.sql 文件,里面有这个:

    CREATE DATABASE my_database;
    
    \c my_database;
    
    SET client_encoding = 'UTF8';
    
    create extension if not exists "uuid-ossp";
    
    CREATE TABLE users(
        user_id UUID DEFAULT uuid_generate_v4(),
        name VARCHAR(50) NOT NULL,
        email VARCHAR(100) NOT NULL UNIQUE,
        password VARCHAR(255) NOT NULL,
        PRIMARY KEY (user_id)
    );
    
    CREATE TABLE places(
        place_id SERIAL,
        name VARCHAR(50) NOT NULL,
        address VARCHAR(50) NOT NULL,
        PRIMARY KEY(place_id)
    );
    
    INSERT INTO places(name, address) VALUES ('Salón de peñas', 'Calle 242');
    INSERT INTO places(name, address) VALUES ('another place', 'another adress');
    INSERT INTO places(name, address) VALUES ('another place', 'another adress');
    INSERT INTO places(name, address) VALUES ('another place', 'another adress');
    

    现在,如果我需要在我的位置表中添加另一行,我需要创建一个 .sql 文件并执行它以添加一行。这可能很烦人,但只有在行中有特殊字符时才需要

    【讨论】:

    • 这行得通,但是你有没有找到预览数据的东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2014-12-02
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多