我使用以下技术堆栈
为安全起见我使用JWT(JSON Web令牌)
我能够使用JWT保护我的应用程序。
我想将JWT令牌存储在mysql数据库中。
问题以下哪种数据类型最适合在MySQL数据库中存储JWT令牌?
答案 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的大小应为TEXT
或VARCHAR
CHARACTER SET utf8
或utf8mb4
。 (COLLATION
可能无关紧要。)
TEXT
限制为64KB;使用较小的VARCHAR
没有太大的优势。
Re:“TEXT
只是一个指针” - 不完全正确。在InnoDB中的某些ROW_FORMATs
中,TEXT
或VARCHAR
可能是指向该行扩展的指针。该操作主要取决于ROW_FORMAT
,而不是数据类型。