MySQL 非法混合字符集等号操作异常技术
无意中使用搜索引擎快照的页面中的搜索框搜索,输入中文提交后台就有报错日志了,如下:
/search/%CF%C2%BB%AE%CF%DF/, exception 'LmlException' with message 'HY000 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='' in ...
报错原因是因为搜索引擎快照界面是 gb2312 编码,使用这样的编码难道是为了节约存储?
在网上找了很多资料,有人说使用 binary() 函数来解决报错,有人说修改数据库编码,让数据库的编码和 MySQL 的设置都保持一致。个人认为统一编码是不太好的做法,至少是不合适的,比如数据库个别表为了支持 emoji,使用的是 utf8mb4 编码,你总不能把所有的表都改成 utf8mb4 编码吧,这也太操蛋了。这些方法其实都是解决编码不一致,并且用户的行为是不能确定的,比如在自己的站内编码肯定是一致的,如果是用户模拟请求的话,就不是自己能控制的了的。
nginx header 下划线问题技术
记录一个以前遇到的问题,nginx 无法获取 header 头里含有下划线的字段信息。
了解了一番,nginx 的配置 underscores_in_headers 默认为 off,会忽略掉带有下划线的 header name。
解决办法可以将下划线改成连接符-减号,或者在 nginx.conf 中将其配置成 on。nginx 这样做也许是为了和绝大多数 http 协议头字段名保持风格一致。
再谈同名 Cookie 优先级问题技术
关于同名 Cookie 在秃域名和二级域名下优先级的问题。
先看看根域名带点和不带点的问题。比如设置了同名 Cookie 在域名 .lmlphp.com 和 lmlphp.com 下,当访问跟域名 lmlphp.com 时,浏览器将两个同名 Cookie 都会发给服务器,哪个优先级更高看哪个放在前面,而在我之前的测试结果里面认为 .lmlphp.com 优先级更高,现在认为是错的。猜测,没有实验过。
下面看真实的测试。
二级域名 blog.lmlphp.com 和 .lmlphp.com 分别设置了 Cookie "LBLOGUSS"。请求二级域名发出的 Header 头 Cookie 内容:
Cookie:UM_distinctid=15b0b9348e3d9-0e113a11eeb39a-317f0158-100200-15b0b9348e5d6; LBLOGUSS=2_1497048432_083ef83241f27343c7cd8e975494763a0a4bfb24; LBLOGUSS=15_1497928608_f666d8527a54b0355ffd407e27f58a318968c772; LBLOGSID=euef9scusfgom5r2rpd73s85b0; a6014_pages=1; a6014_times=37; CNZZDATA1253286891=1916695458-1490971098-%7C1496411346; Hm_lvt_611d0ab5726828d7f68896cec0aefbf6=1496160084,1496265782,1496274079,1496442120; Hm_lpvt_611d0ab5726828d7f68896cec0aefbf6=1496444472; _ga=GA1.2.106199550.1490547854; _gid=GA1.2.2119853286.1496442120
Excel 高级功能查找两列不同项技术
Excel 高级功能,使用 IF 和 COUNTIF 函数快速找出两列中的不同项,一张图就看明白了。
第一项输入公式之后,右下角下拉,就全都找出来了。C:C 代表整个 C 列,A2 代表坐标,A 列的第二个。
是不是看一眼就明白了。
JavaScript try catch 语句技术
在 js 中,很少人使用 try catch 语言,其实偶尔还是需要的。
常用的场景,比如使用 JSON.parse() 时。
try { throw new Error("Whoops"); } catch (e) { if (e instanceof EvalError) { console.log(e.name + ': ' + e.message); } else if (e instanceof RangeError) { console.log(e.name + ': ' + e.message); } }