西西河

主题:【原创】javascript字串mysql的float -- 铁手

共:💬11 🌺34
分页树展主题 · 全看首页 上页
/ 1
下页 末页
  • 家园 【原创】javascript字串mysql的float

    随手记个帐,供以后参考,也供有需要者参考。

    最近改程序,碰到两个奇怪的问题,一个是和javascript 的 string 有关,一个是和 mysql的float有关。

    先是javascript中的string。比如一个 var str="abcdefg" 这样的一个字符串,为了获得位置3处的字符值,按照以前的语言习惯,很自然的就开始用str[3]的方式,意想不到的是,在firefox,ie8工作很正常,但是在旧版ie中不行。规矩的做法,应该是用 charAt(3) 函数来获得相关值。实在是不明白为什么不能直接用[]来获取,而非得用 charAt()这样的,我觉得是大题小做的方式。新版的浏览器似乎承认这个做法了。将来为保险起见,还是应该用 charAt()。

    再一个就是mysql中的float类型的字段。想当然的以为精度够高,用来作为index可以很好解决一个问题。结果,排序是可以,数值大小的比较就出现了问题。追究下去,给我的感觉是,存储的内容大小还是有差别,但是选择语句给出结果的时候,却是相同的。乘以一个大的整数,比如1百万,可能就能看出差异来。关于float类型的不可靠,在mysql的文档中实际上有说明,但是没注意到,被忽略了。按照文档说明,用decimal可以保证精确的值,但是内容保存方式和flaot不同,大概会增加不少内部操作,影响性能。

    以后记得,能避免float尽可能避免,不能避免的情况下,用decimal。

    • 家园 可以开个类似于WIKI的维护清单的板块
    • 家园 字符串主要是由于unicode的关系

      [3]表示的是第三个字节处的Byte值

      而charAt(3)则是第三个字符,有不少语言考虑国际化的问题,第三个字符指的是第三个完整的字符。譬如“四大名捕之铁手”,第三个字符是“名”,而第三个Byte的值。。。就难说了

      • 家园 太正确了,取值不同,字节码和字符,哈哈
      • 家园 charAt(3)则是第4个字符

        至于 str[x]出错,那是IE支持问题(连IE8都不支持)和Byte无关——也就是说在FF下面 str[1] == str.charAt(1) (页面输出的头部编码要和文件本身的编码格式相同). 因为js内部是采用Unicode方式处理一切信息。

      • 家园 的确是有这个问题,不知道现在是不是统一了

        从新版的浏览器来看,对字符串的处理,的确是按照字符为基本单位,比如字符串的长度,都是按照字符来算,两个中文字算是2,两个字母,也算是2,用字节数就不一样了。老版的ie好像也是这样。

        区别是在于[]的对待上,新的浏览器就当做是字符来处理了。这样就比较统一了。ie不知道是不是完全支持。

    • 家园 float应该尽量避免

      32位精度太低了,除非性能上有考虑,用64比较保险。

    • 家园 【原创】多台服务器之间的cross connect

      假设你有多台服务器,为了提高性能,可能会考虑服务器之间有直接的网络连接,这样,服务器之间通信就不用经过路由,而是直接的点对点,传送速度会快很多。比如通过公开IP的PING需要几十毫秒的,点对点可能只需要不到1毫秒。

      假设硬件连接已经完成,需要做的是进行软件设置。假设是两台服务器,每台当中都有两个网卡,一个网卡供外联(eth0),一个网卡供内联(eth1)。供内联的两个网卡之间用 cross connect 网线相连。

      以下步骤在redhat这一系中实现。

      1、修改 /etc/sysconfig/network-scripts/ifcfg-eth1 的内容为:

      DEVICE=eth1

      IPADDR=169.254.0.2

      NETMASK=255.255.0.0

      BOOTPROTO=static

      ONBOOT=yes

      TYPE=Ethernet

      其中,169.254.0.0/16 这个ip地址块是被保留做 Link-local addressing 用,可以挑选里面的任何地址。

      在另外一台服务器中,做同样的修改,但是取一个不同的ipaddress,比如 169.254.0.3

      修改完毕保存后,在两台服务器中都执行下面的命令:

      ifdown eth1

      ifup eth1

      之后,用命令 route 查看,会发现类似下面这行内容。

      169.254.0.0 * 255.255.0.0 U 0 0 0 eth1

      这时候,可以在一台服务器上 ping 另外一台服务器,比如在 169.254.0.2 上 ping 169.254.0.3,如果通了,就大功告成了。如果不能成功,关掉防火墙再试试看。一般情况下,防火墙需要重新设置来允许这些ip。

      • 家园 先花再讨论,也许为了以后,还是上个switch吧

        还是上个交换机吧,哪怕是个傻瓜的二层交换机。

        如果只有两台服务器,这样直连没什么问题,如果服务器多了,就要在机器上再加网卡,加了网卡也就差不多成了一个软交换机了,还不如弄个背板带宽大的二层交换,如果是网站应用,应用横向扩展,不断加入server几乎是一定的,这样将来服务器往交换机上一叉就得。把网络部分和服务器区隔开,将来诊断故障也方便,如果将来有更高要求,也方便换高速网络。

      • 家园 探讨一下

        我觉得两台服务器之间的latency直接连跟通过switch连差别不大。我可以想到一些情况需要用网线直接连:

        1 需要特别小的latency。有些高性能计算需要。比如模拟。

        2 需要独立的带宽,比如storage server。

        对于一般的web service的话,直接连似乎没有必要,内部的两台服务器之间最多通过本层的switch,不会去上层的router绕一圈的,所以区别不大。但设置要麻烦多了,而且不好扩展。

        My two cents。

分页树展主题 · 全看首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河