我正在维护的应用程序使用“latin1”字符集将从 Web 日志中提取的用户代理加载到 MySQL 表列中。有时,它无法加载如下所示的用户代理:
Mozilla/5.0 (Iâ?; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML^C like Gecko) Version
我怀疑它正在窒息Iâ?
。我正在努力弄清楚是否应该支持它,或者它是否是上游日志系统引入的损坏。这是 HTTP 标头中的合法用户代理吗?
我正在维护的应用程序使用“latin1”字符集将从 Web 日志中提取的用户代理加载到 MySQL 表列中。有时,它无法加载如下所示的用户代理:
Mozilla/5.0 (Iâ?; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML^C like Gecko) Version
我怀疑它正在窒息Iâ?
。我正在努力弄清楚是否应该支持它,或者它是否是上游日志系统引入的损坏。这是 HTTP 标头中的合法用户代理吗?
从技术上讲,注释中允许使用大于 127 的八位字节。RFC 2616 使它们默认为 ISO-8859-1,但 HTTPbis(即将发布的 RFC 2616 修订版)删除了该规则,因此有时在遥远的将来,我们可能能够转向理智的编码。
建议:去除所有大于 127 的八位字节。
HTTP 1.1 RFC2616参考 ISO-8859-1,它是一个基于拉丁文的单字节字符集。
考虑到 HTTP 流量应该是单字节的,我也将 latin1 字符集用于我的类似日志。决定只是让我的索引更小。
如果将 UTF8 与 VARCHAR 一起使用,则只有多字节的字符需要额外的字节,因此在表空间中,它并不多。但是,索引以固定宽度存储,因此,它们会用空格填充以备不时之需(UTF8 索引是 latin1 索引的三倍)。
如果偶尔的奇怪标题不可读,它不会影响我。但是,如果您不为该列编制索引,则不妨使用 UTF8。