我分叉了 这个 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
的问题吗?
您的问题恰恰在于您的
client_encoding
设置为UTF8
。相反,您应该将其设置为适合您的数据的编码。由于 ä
在数据中被编码为 E4
,因此应该是 LATIN1
或 WIN1252
。