Drizzle ORM 和 Postgres:使用突变元音时,编码 »UTF8« 的字节序列无效

问题描述 投票:0回答:1

我分叉了 这个 Next.JS-Boilerplate 存储库,它使用

drizzle-orm
node-postgres

我创建了一个数据库方案

export const myTableSchema = pgTable('myTable', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});

然后编写功能来存储和更新数据库中的条目。这通常有效。

await db
  .update(myTable)
  .set({ name: "ä" })
  .where(
    eq(myTable.id, Number(id)),
  )
  .returning();

但是,如果我输入德语元音变音(变异元音,如“ä”或“ü”),我会得到

error: invalid byte sequence for encoding »UTF8«: 0xe4 0x68 0x73
    at /home/testuser/test/node_modules/pg/lib/client.js:526:17
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async eval (webpack-internal:///(rsc)/./node_modules/drizzle-orm/node-postgres/session.js:60:22)
    at async PUT$1 (webpack-internal:///(rsc)/./src/app/[locale]/(auth)/api/work_areas/route.ts:124:33)
    at async eval (webpack-internal:///(rsc)/./node_modules/@sentry/nextjs/build/cjs/common/wrapRouteHandlerWithSentry.js:58:36)
    at async /home/testuser/test/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:55755
    at async eO.execute (/home/testuser/test/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:46523)
    at async eO.handle (/home/testuser/test/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:57089)
    at async doRender (/home/testuser/test/node_modules/next/dist/server/base-server.js:1359:42)
    at async cacheEntry.responseCache.get.routeKind (/home/testuser/test/node_modules/next/dist/server/base-server.js:1569:40)
    at async DevServer.renderToResponseWithComponentsImpl (/home/testuser/test/node_modules/next/dist/server/base-server.js:1489:28)
    at async DevServer.renderPageComponent (/home/testuser/test/node_modules/next/dist/server/base-server.js:1920:24)
    at async DevServer.renderToResponseImpl (/home/testuser/test/node_modules/next/dist/server/base-server.js:1958:32)
    at async DevServer.pipeImpl (/home/testuser/test/node_modules/next/dist/server/base-server.js:917:25)
    at async NextNodeServer.handleCatchallRenderRequest (/home/testuser/test/node_modules/next/dist/server/next-server.js:272:17)
    at async DevServer.handleRequestImpl (/home/testuser/test/node_modules/next/dist/server/base-server.js:813:17)
    at async /home/testuser/test/node_modules/next/dist/server/dev/next-dev-server.js:339:20
    at async Span.traceAsyncFn (/home/testuser/test/node_modules/next/dist/trace/trace.js:154:20)
    at async DevServer.handleRequest (/home/testuser/test/node_modules/next/dist/server/dev/next-dev-server.js:336:24)
    at async invokeRender (/home/testuser/test/node_modules/next/dist/server/lib/router-server.js:173:21)
    at async handleRequest (/home/testuser/test/node_modules/next/dist/server/lib/router-server.js:350:24)
    at async requestHandlerImpl (/home/testuser/test/node_modules/next/dist/server/lib/router-server.js:374:13)
    at async Server.requestListener (/home/testuser/test/node_modules/next/dist/server/lib/start-server.js:141:13) {
  length: 167,
  severity: 'ERROR',
  code: '22021',
  detail: undefined,
  hint: undefined,
  position: undefined,
  internalPosition: undefined,
  internalQuery: undefined,
  where: 'unbenanntes Portal Parameter $1',
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'mbutils.c',
  line: '1665',
  routine: 'report_invalid_encoding'
}

我签入了

postgres
,它显示了

postgres@myhost:~$ psql -l
                                                    List of databases
   Name    | Owner      | Encoding  | Collate      | Ctype       | ICU Locale | Locale Provider |     Access privileges     
-----------+------------+-----------+--------------+-------------+------------+-----------------+-----------------------------
     my_db | postgres   | UTF8      | de_DE.UTF-8  | de_DE.UTF-8 |            | libc            | =Tc/postgres               +
           |            |           |              |             |            |                 | postgres=CTc/postgres      +
           |            |           |              |             |            |                 | my_db=CTc/postgres
...

它还指出

CLIENT_ENCODING
SERVER_ENCODING
均设置为
UTF8

然后我继续直接通过

psql
运行完全相同的更新,它按预期工作。

然后,我尝试从

node-postgres
切换到
Postgres.JS
,如 Drizzle ORM 文档中所述。并没有解决问题。

我还尝试以某种方式将字符串从最初应该是 UTF-8 的字符串转换为 UTF-8 - 但没有成功。

myuser@myhost:~$ locale
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

这是

drizzle
的问题吗?

postgresql next.js utf-8 drizzle drizzle-orm
1个回答
0
投票

您的问题恰恰在于您的

client_encoding
设置为
UTF8
。相反,您应该将其设置为适合您的数据的编码。由于
ä
在数据中被编码为
E4
,因此应该是
LATIN1
WIN1252

© www.soinside.com 2019 - 2024. All rights reserved.