knexjs字符编码

vyswwuz2  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(414)

我的问题是,是否有可能将knexjs的字符编码改为utf8mb4。它似乎默认为utf8。
当我试图在nodejs服务器上通过

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

knexjs抛出一个错误,表示指定的键太长。这是因为knexjs的varchar length默认为255。utf8mb4字段的最大长度为191个字符。
有没有一个选项可以告诉knexjs要使用什么字符编码(从而将varchar字段的长度更改为191),或者我必须自己将每个varchar字段的长度设置为191,并将其作为第二个参数传递给knexjs table.string(..., 191) ?
错误消息:

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' }
nbysray5

nbysray51#

你得到那个错误不是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();
});

相关问题