【问题标题】:KnexJS Character EncodingKnexJS 字符编码
【发布时间】:2018-01-12 22:17:52
【问题描述】:

我的问题是是否可以将 KnexJS 的字符编码更改为 utf8mb4。它似乎默认为 utf8。

当我尝试在 NodeJS 服务器上的当前 KnexJS 版本上创建表时,通过

db.schema.createTable('testtable', table => {
  table.increments('id');
  table.string('foo').unique();
});

KnexJS 抛出一个错误,说指定的键太长。这是因为 KnexJS 的 varchar 长度默认为 255。utf8mb4 字段的最大长度为 191 个字符。

是否有一个选项可以告诉 KnexJS 使用什么字符编码(从而将 varchar 字段的长度更改为 191),或者我是否必须自己将每个 varchar 字段的长度设置为 191,方法是将其作为第二个参数传递给 @ 987654322@?

错误信息:

Error creating testtable table { Error: Specified key was too long; max key length is 767 bytes
at Packet.asError (C:\Users\nicoe\WebstormProjects\worktrackr\backend\node_modules\mysql2\lib\packets\packet.js:713:13)
at Query.Command.execute (C:\Users\nicoe\WebstormProjects\worktrackr\backend\node_modules\mysql2\lib\commands\command.js:28:22)
at Connection.handlePacket (C:\Users\nicoe\WebstormProjects\worktrackr\backend\node_modules\mysql2\lib\connection.js:515:28)
at PacketParser.onPacket (C:\Users\nicoe\WebstormProjects\worktrackr\backend\node_modules\mysql2\lib\connection.js:94:16)
at PacketParser.executeStart (C:\Users\nicoe\WebstormProjects\worktrackr\backend\node_modules\mysql2\lib\packet_parser.js:77:14)
at Socket.<anonymous> (C:\Users\nicoe\WebstormProjects\worktrackr\backend\node_modules\mysql2\lib\connection.js:102:29)
at Socket.emit (events.js:159:13)
at addChunk (_stream_readable.js:265:12)
at readableAddChunk (_stream_readable.js:252:11)
at Socket.Readable.push (_stream_readable.js:209:10)
at TCP.onread (net.js:598:20)


code: 'ER_TOO_LONG_KEY',
  errno: 1071,
  sqlState: '42000',
  sqlMessage: 'Specified key was too long; max key length is 767 bytes' }

【问题讨论】:

  • 你有没有想过这个问题?我认为使 255 成为有效值的正确解决方案是在执行迁移时更改 knex 的底层编码方案,但我不知道该怎么做。

标签: mysql node.js knex.js


【解决方案1】:

您遇到该错误并不是 knex 的错。就是你创建了长度为255的字符串列,不传任何参数是默认的。

您可以通过以下方式更改列的默认长度:

db.schema.createTable('testtable', table => {
  table.increments('id');
  table.string('foo', 300).unique(); // 300 length
});

或者如果你想存储非常大的文本,你可以使用:

db.schema.createTable('testtable', table => {
  table.increments('id');
  table.text('foo').unique();
});

【讨论】:

  • 我知道给字符串函数第二个参数可以设置我的问题中已经提到的长度。我感兴趣的是,是否可以将 string() 函数 varchar 长度默认为 255 以外的其他长度(例如通过配置)。也许创建一个长度为 191 的 const 并将其传递给每个 string() 函数可能是另一种保持代码易于维护的方法。但这似乎不是最好的解决方法。
  • 您可以使用配置并让各种长度存在。您可以在迁移中要求配置并这样做,但我真的不明白这一点。
  • 嗯,关键是当我这样做时,我只有一个地方可以设置 varchars 的长度。使用您的方法,更改排序规则有时会导致另一个最大密钥长度(如在我的问题中)不必为我想在我的数据库中创建的每个“字符串”字段完成。
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 2011-03-02
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多