存储JWT令牌的最佳MYSQL或Maria DB数据类型是什么?

时间:2016-04-15 05:56:42

标签: mysql database laravel-5.2 jwt sqldatatypes

我使用以下技术堆栈

  • Laravel 5.2
  • MySQL的

为安全起见我使用JWT(JSON Web令牌)

我能够使用JWT保护我的应用程序。

我想将JWT令牌存储在mysql数据库中。

  

问题以下哪种数据类型最适合在MySQL数据库中存储JWT令牌?

  1. VARCHAR
  2. CLOB
  3. TEXT
  4. LONG TEXT

2 个答案:

答案 0 :(得分:6)

与其他任何事情一样,答案是“它取决于”。

首先,您需要确定存储完全编码的JWT是否是正确的解决方案。我倾向于不存储JWT字符串,而是存储用于构建JWT的声明,这将在数据库中节省大量空间。

如果您认为存储JWT是正确的方法,那么我们可以查看您的选项。

TEXT和LONGTEXT只是CLOB的类型,所以我们可以忽略它。

TEXT和VARCHAR都有64kb的限制,所以高于此值的任何东西都需要LONGTEXT(或MEDIUMTEXT,你没有提到但是可以选择)。

TEXT和VARCHAR之间的区别在于VARCHAR存储在行中,但TEXT基本上是指针。如果您要经常阅读JWT,VARCHAR会更快,但是更大的字符串会导致每个单独的行更大,这将会影响性能。

与JWT一样大,我会说TEXT是将JWT存储在数据库中的不错选择。如果你绝对相信JWT会保持很小,那么VARCHAR可能会产生更好的读取性能,但你最好用现实世界的数据来测试。

如果你需要一个大于TEXT能够提供的字段,那么我会重申我的建议,以避免存储编码的JWT,但LONGTEXT是一个选项。

答案 1 :(得分:1)

基于这个例子,我建议使用'编码'的base64令牌:

TEXT CHARACTER SET ascii COLLATE ascii_bin

通常,JSON的大小应为TEXTVARCHAR CHARACTER SET utf8utf8mb4。 (COLLATION可能无关紧要。)

TEXT限制为64KB;使用较小的VARCHAR没有太大的优势。

Re:“TEXT只是一个指针” - 不完全正确。在InnoDB中的某些ROW_FORMATs中,TEXTVARCHAR可能是指向该行扩展的指针。该操作主要取决于ROW_FORMAT,而不是数据类型。