对于为OAuth使用而创建的MySQL表,使用latin1而不是utf8会产生什么影响?

时间:2011-04-19 01:47:33

标签: mysql utf-8 oauth innodb latin1

我正在共享服务器上设置OAuth支持。我试图安装的服务器端PHP OAuth库就是这个:

http://code.google.com/p/oauth-php/downloads/list

我正在按照此处的安装说明进行操作:

http://code.google.com/p/oauth-php/wiki/ConsumerHowTo

在笔记中有一个提示,使用安装包中的SQL脚本为您设置表和数据库。当我尝试通过phpMyAdmin中的导入(SQL)功能执行脚本时,我在其中一个表上出现“Key Too Long”错误。换句话说,我遇到了使用MySQL / InnoDB表时发现的最大密钥长度限制。

为了解决这个问题,我将“charset = utf8”的所有实例替换为“charset = latin1”,因为utf8每个字符需要3个字节,而latin1每个字符需要1个字节。脚本执行正常,所有表都已正确创建。

据我所知,表中使用的所有字段都不需要支持多字节国际字符。我发现问题的唯一方法是,如果我访问的其中一个OAuth连接服务在其消费者密钥或密钥中使用国际字符,那么到目前为止我还没有遇到过这种情况。

任何人都可以告诉我这个解决方法是否会在任何时候在可能的背后咬我?此外,如果有人有一个更好的解决方案来解决“关键太长”问题而不牺牲utf8字符集的使用我想知道它。

1 个答案:

答案 0 :(得分:1)

从技术上讲,所有字符串必须首先在urlencoding之前进行utf8编码。请参阅OAuth 1.0规范部分5.1:使用[RFC3986]百分比编码(%xx)机制对所有参数名称和值进行转义。不在非保留字符集中的字符([RFC3986]第2.3节)必须进行编码。非保留字符集中的字符不得编码。编码中的十六进制字符必须是大写的。根据[RFC3629]对百分比进行编码之前,文本名称和值必须编码为UTF-8八位字节。

因此,如果您有任何也不是ASCII(第7位= 0)的Latin-1字符,那么在从数据库中提取字符串之后,在将它们用于之前,您必须将字符串重新编码为UTF-8 OAuth协议。