Запросы от NodeJS к базе данных PostgreSQL неправильно отображают символы UTF8

Я работаю над проектом, мой родной язык — испанский, и в моей базе данных я использую такие символы, как ñ и é. Когда я использую оболочку psql, эти символы правильно отображаются на терминале, но когда я делаю запрос с помощью node-postgress, эти символы не отображаются, вместо этого я получаю ¤ или ¢.

В моей базе данных у меня есть и client_encoding, и server_encoding для UTF8, и я даже проверил с помощью node-postgress, используя запрос, чтобы увидеть, были ли они также установлены в UTF8, и они не изменились по какой-то другой причине.

Мое подключение к базе данных настроено так

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.

У меня в основном та же проблема, что и этот вопрос, на который не получен ответ


person Matias Correa    schedule 06.10.2020    source источник


Ответы (1)


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

Итак, я понял, например, новый регистр пользователя, и у них есть ñ или ó в их имени, внутри базы данных это отображается как ├▒ и ├│. НО, если я делаю запрос со своего сервера и отправляю ответ json, символы ├▒ ├│ исчезают, а вместо них отображается ñ ó.

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

После этого я понял, что, возможно, использование команды \i (команда для выполнения файла .sql) из оболочки psql может вызвать подобное поведение, например, вставку данных с сервера с почтовым запросом. И это произошло! так что теперь у меня есть файл 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 и выполнить его, чтобы добавить строку. Это может раздражать, но это необходимо только тогда, когда в строке есть специальные символы.

person Matias Correa    schedule 06.10.2020
comment
Это работает, но вы нашли что-то для предварительного просмотра данных? - person Dani; 25.07.2021