我正在共享服务器上设置 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 表时发现的最大 key 长度限制。
为了解决这个问题,我将所有“charset=utf8”实例替换为“charset=latin1”,因为 utf8 每个字符需要 3 个字节,而 latin1 每个字符需要 1 个字节。脚本执行良好,所有表均已正确创建。
据我所知,表中使用的所有字段都不需要支持多字节国际字符。我能看到问题发展的唯一方法是,如果我访问的 OAuth 连接服务之一在其消费者 key 或 secret 中使用国际字符,到目前为止我还没有遇到过这种情况。
谁能告诉我这个变通办法是否会在任何时候和可能的地方咬我的屁股?此外,如果有人有更好的解决方案来解决“ key 太长”问题而不牺牲 utf8 字符集的使用,我很想知道。
最佳答案
从技术上讲,所有字符串必须先进行 utf8 编码,然后再进行 urlencoding。请参阅 OAuth 1.0 规范第 5.1 节:使用 [RFC3986] 百分比编码 (%xx) 机制转义所有参数名称和值。不在非保留字符集中的字符([RFC3986] section 2.3)必须被编码。不得对非保留字符集中的字符进行编码。编码中的十六进制字符必须大写。在根据 [RFC3629] 对它们进行百分比编码之前,文本名称和值必须编码为 UTF-8 八位字节。
因此,如果您有任何不是 ASCII(位 7=0)的 Latin-1 字符,那么您必须在从数据库中提取字符串之后以及在使用它们之前将字符串重新编码为 UTF-8 OAuth 协议(protocol)。
关于mysql - 对于为 OAuth 使用创建的 MySQL 表,使用 latin1 而不是 utf8 有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5710725/