2011-04-19 50 views
1

我正在获取设置在共享服务器上的OAuth支持。服务器端PHP的OAuth库我试图安装是这个:对于为OAuth使用而创建的MySQL表,使用latin1而不是utf8会产生什么影响?

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 = latin1”的所有“charset = utf8”替换为utf8每个字符需要3个字节,latin1每个字符1个字节。该脚本执行得很好,所有表格都正确创建。

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

任何人都可以告诉我,这种解决方法是否会在任何时候在背后咬我,哪里可能?另外,如果有人有更好的解决方案来解决“key too long”问题而不牺牲使用utf8字符集,我想知道它。

+0

utf8通常不需要每个字符3个字节,根据字符的不同,它需要从1到5的任何位置。正常ASCII范围内的任何内容在utf8中都完全相同。 – 2011-04-19 02:02:52

回答

1

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

所以,如果你有任何不是ASCII的拉丁字符(第7位= 0),那么你必须重新编码字符串为UTF-8后,从数据库中拉出来,并在使用之前在OAuth协议中。

相关问题