1.7Unicode 支持ASCII一统江湖的日子已经一去不复返了,“字符(character)”和“字节(byte)”是可互换的以及“外国(foreign)”(从Anglocentric观点来看)文本是具有异国情调的异常。合适的国际语言支持不再是可选项。 所有问题的解决方案是Unicode。外面有许多对Unicode的误解。它不是一个字符集,不是一个代码页,不是一个文件格式,并且它和加密也没有任何关系。探索Unicode是如何工作的很让人着迷的事,但是这个超出了本文的范围,我打心底里推荐你Google它并且试试几个例子。 Unicode对应的重要的数据库功能如下:
PostgresSQL支持 UTF-8 。默认情况下,它的 CHAR 、 VARCHAR 、 TEXT 类型采用 UTF-8 格式,这意味着这些类型仅接受 UTF-8 数据和适用于 UTF-8 格式的所有转换,从字符串级联到使用正则表达式搜索,这些都是显示的 UTF-8 格式。上面这些都是有效的。 MS SQL Server 2008 不支持 UTF-16;但它支持 UCS-2 -- UTF-16 的一个过时的子集(a deprecated subset)。多数情况下,不会有问题. 但是, 偶尔会损坏数据。因为,它把文本当成宽字符(如 2 个字节)处理,所以遇到 UTF-16 的 4-字节字符时,会毫不犹豫地切掉一半。轻者,数据损坏。严重的时候,会导致你的工具链中某些东西出现问题,后果非常严重。那些替微软辩护的人会立刻反驳:这是不可能的。因为,在 Unicode 的基本多文平面(basic multilingual plane)外面,还包含其他东西。这种说法实在是荒谬。数据库就是用来存储,读取和修改数据而已。 一个数据库,如果因为存入错误的数据而出问题,那不是跟下载错误的文件会导致路由器崩溃一样荒唐? 2012年后MS SQL Server版本都支持UTF-16,如果你确定你为数据库设置了兼容UTF-16的校验规则。 这在2012年后的版本中是一个莫名其妙的功能。不过,迟到总比不到好。 1.8. 可以正常使用的数据类型一个普遍误解的概念是所有的数据库有相同的数据类型 – INT、 CHAR、 DATE等等。 不是这样的。 PostgresSQL的数据类型系统非常有用、直观、没有 bug或效率低下的烦恼,显然数据类型的设计使用生产效率为核心。 相比之下,MS SQL服务器的类型识别系统就像是Beta版的测试软件。它不具有PostgreSQL类型识别系统所具有的功能集,而且由于诸多陷阱使得用户异常困惑,从而让粗心的用户掉入缺陷网中。我们仔细对比一下:
SELECT CONVERT(datetime, '2001-02-03T12:34:56.789', 126); --这条语句会生成datetime值: 2001-02-03 12:34:56:789 就是这样-你只要知道“126”是把字符串转换为某种格式的datetime的编码即可。MSDN给出与这些奇奇怪怪数字对应的表。我没有给出与PostgreSQL相同的例子,这是因为我没有找到与格式"Saturday 03 Feb 200"相对应的奇怪的数字。如果某人给出的数据含有这个日期类型,那么我猜你将不得不做一些字符串处理的工作了(很遗憾,在MS SQL服务器里几乎没有字符串处理功能。) INTERVAL
PostgreSQL:INTERVAL类型表示一个时间段,如“30微秒”或者“50年”。它也可以是负数,这看起来有些不合常理,如果你知道一个单词“以前(ago)”存在的话就不会了。PostgreSQL也知道“ago”,事实上它也接受类似‘一天前(1 day ago)’字符串作为interval值(这个值在内部用-1天的时间段表示)。interva让你有一个直观的日期计算,并且作为第一类的数据类型来存储持续时间。它们像你期望的那样准确,并且可以自由的改造和转换成任何有意义的数据,也可以由任何有意义的数据转换而来。 MS SQL Server:不支持interval数据类型。
SELECT akeys(hstore(my_array, my_array)) FROM my_table; 即把数组放入到HSTORE的键值对里,这样就会强制删除重复的项(因为不允许键重复),然后再从HSTORE中提取键就可以了。这再一次体现了PostgreSQL的功能多样性。 MS SQL服务器:不支持键值对存储。
1.9. 脚本化PostgreSQL 完全可以由命令来操作. 因为它在操作系统中就是这么用的 (Windows 操作系统是个例外). 这种方式既高效, 又安全. 如果有需要, 你甚至可以在手机上, 通过 SSH 登录服务器配置 PostgreSQL(这种事, 本人干过几次). 通过脚本, 能执行诸如: 自动部署, 性能调节, 安全, 管理 和分析任务等操作. 跟图形用户界面不一样, 脚本能被复制, 版本控制, 文档化, 自动化, 审查化(Reviewed), 批量化, 以及差异化(Diffed). 对于重要的工作来说, 文本编辑器和命令行才是王道. MS SQL Server 通过图形用户界面(GUI)操作. 就算加上 Powershell 的辅助, 我也不知道它能在多大程度上实现自动化; 如果你在 Google 上搜 MS SQL Server 的用法, 得到的答案会基本上是 "在数据库上点右键, 然后选 任务...(Tasks...)". 在速度慢或者高延时的网络连接中, 使用文本命令行的效果, 远比用图形用户界面好的多. 在写这篇文章的时候, 我正准备通过 VPN, 登录一台位于 3,500 英里外的服务器, 执行管理操作. 这里的 WiFi, 信号相当不稳定. 谢天谢地, 我用的是 Ubuntu/PostgreSQL. (真的有地球人通过图形用户界面管理服务器吗?) 1.10.很好地整合了外部语言由编程环境连接并使用PostgreSQL非常、非常简单,这是因为libpq,即PostgreSQL的外部应用程序接口(API),设计的非常完美而且文档也非常完备。这就意味着编写嵌入到PostgreSQL里的应用将非常简单方便,这也使得PostgreSQL功能更多,更适合于应用在数据分析上。我曾多次用C或者C++编写了简短的程序,它可进行PostgreSQL连接,获取数据以及对获取到的数据进行大量计算,其中用到了多线程或者特殊的CPU指令-不过不适合对数据库本身进行数据填入。我还写过这样的C程序:它使用了setuid,从而允许在PostgreSQL里以普通用户执行某些管理员才能完成的任务。快速而且简练地做到这些真的很方便。 MS SQL服务器整合的外部语言的方法各有不同。有时候你需要安装其他驱动。有时候你需要创建类来存储你所查询的数据,这种情况下就意味着你在编译时就要知道数据是什么样子。最为重要的是,它的文档让人困惑、一团糟,要做成一件事就要 耗费不必要的时间,而且非常痛苦。 |