单列索引,顾名思义也就是只有一个字段的索引列。
组合索引,又称复合索引,两个或更多个列上的索引被称作复合索引。对于复合索引,他们都遵循左侧原则,也是就是说一个查询可以只使用复合索引最左侧的一部份。
例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 。
2016年11月28日星期一
Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;
bin 是二进制, a 和 A 会别区别对待.
例如你运行:
SELECT * FROM table WHERE txt = 'a'
那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容。
一、官方文档说明
当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘?'等于‘ss'。
utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。
对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
utf8_general_ci也适用与德语和法语,除了‘?'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。
二、简短总结
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。
bin 是二进制, a 和 A 会别区别对待.
例如你运行:
SELECT * FROM table WHERE txt = 'a'
那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容。
一、官方文档说明
当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘?'等于‘ss'。
utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。
对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
utf8_general_ci也适用与德语和法语,除了‘?'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。
二、简短总结
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。
2016年11月25日星期五
CSS如何指定元素高度为100%
在CSS中,如果你设置一个元素的width为100%,那么它会自动占据全屏宽度,于是你很自然的想到如果给height也设置100%,它就会占据全屏高度。
然而事实是并不会,答案源自于HTML计算元素高度的方法。
Web浏览器在计算有效宽度时会考虑浏览器窗口的打开宽度。如果你不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度。
但是高度的计算方式完全不一样。事实上,浏览器根本就不计算内容的高度,除非内容超出了视窗范围(导致滚动条出现)。或者你给整个页面设置一个绝对高度。否则,浏览器就会简单的让内容往下堆砌,页面的高度根本就无需考虑。
因为页面并没有缺省的高度值,所以,当你让一个元素的高度设定为百分比高度时,无法根据获取父元素的高度,也就无法计算自己的高度。换句话说,父元素的高度只是一个缺省值:height: auto;。当你要求浏览器根据这样一个缺省值来计算百分比高度时,只能得到undefined的结果。也就是一个null值,浏览器不会对这个值有任何的反应。
那么,如果想让一个元素的百分比高度height: 100%;起作用,你需要给这个元素的所有父元素的高度设定一个有效值。
考虑如下代码
<html>
<head>
...
</head>
<body>
<div class="test">
...
</div>
</body>
</html>
如果想让test占据全屏高度,那么你需要给它所有的父元素指定有效值,也就是body元素和html元素。
如下所示。
html {
height: 100%
}
body {
height: 100%
}
这样,代码就能生效了。
然而事实是并不会,答案源自于HTML计算元素高度的方法。
Web浏览器在计算有效宽度时会考虑浏览器窗口的打开宽度。如果你不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度。
但是高度的计算方式完全不一样。事实上,浏览器根本就不计算内容的高度,除非内容超出了视窗范围(导致滚动条出现)。或者你给整个页面设置一个绝对高度。否则,浏览器就会简单的让内容往下堆砌,页面的高度根本就无需考虑。
因为页面并没有缺省的高度值,所以,当你让一个元素的高度设定为百分比高度时,无法根据获取父元素的高度,也就无法计算自己的高度。换句话说,父元素的高度只是一个缺省值:height: auto;。当你要求浏览器根据这样一个缺省值来计算百分比高度时,只能得到undefined的结果。也就是一个null值,浏览器不会对这个值有任何的反应。
那么,如果想让一个元素的百分比高度height: 100%;起作用,你需要给这个元素的所有父元素的高度设定一个有效值。
考虑如下代码
<html>
<head>
...
</head>
<body>
<div class="test">
...
</div>
</body>
</html>
如果想让test占据全屏高度,那么你需要给它所有的父元素指定有效值,也就是body元素和html元素。
如下所示。
html {
height: 100%
}
body {
height: 100%
}
这样,代码就能生效了。
2016年11月22日星期二
如何在CI框架中集成Smarty模板引擎
框架对于提升一个项目的开发速度的帮助还是很大的,CI也就是CodeIgniter,是一个轻量级,语法简单,但功能却十分强大的框架,而且CI的中文社区有十分完善的Documentation,比较适合E文苦手的小伙伴上手。
同样的,模板引擎也能够大大减低html文件中的重复代码量,提升代码可读性和开发效率。如果能把两者结合就更好了,基于这样的目的,本文介绍如何在CI框架中集成Smarty模板。
一、下载最新版本的Smarty文件(我用的版本是3.1.10),并Copy到CI应用目录下的libraries文件夹中。
二、在libraries文件夹中新建文件Cismarty.php
三、在你的APPPATH同级目录中新建template_c, configs文件夹,并确认Smarty有读写权限。(cache和views文件夹是CI自带的,所以可以不用创建,当然如果你喜欢的话也能自定义其他的目录供Smarty使用)
四、在项目的config文件夹中找到autoload.php并修改以下行。
$autoload['libraries'] = array('Cismarty');
五、在项目的core目录新建文件MY_Controller.php
这一步是可选的,目的是让你在开发中可以直接使用类似$this->display(#), $this->assign(#)的代码。
完成啦!接下来可以做一些测试,像这样。
如果一切顺利,你就能看到‘I am using Smarty with CI!’的字样啦!
同样的,模板引擎也能够大大减低html文件中的重复代码量,提升代码可读性和开发效率。如果能把两者结合就更好了,基于这样的目的,本文介绍如何在CI框架中集成Smarty模板。
一、下载最新版本的Smarty文件(我用的版本是3.1.10),并Copy到CI应用目录下的libraries文件夹中。
二、在libraries文件夹中新建文件Cismarty.php
三、在你的APPPATH同级目录中新建template_c, configs文件夹,并确认Smarty有读写权限。(cache和views文件夹是CI自带的,所以可以不用创建,当然如果你喜欢的话也能自定义其他的目录供Smarty使用)
四、在项目的config文件夹中找到autoload.php并修改以下行。
$autoload['libraries'] = array('Cismarty');
五、在项目的core目录新建文件MY_Controller.php
这一步是可选的,目的是让你在开发中可以直接使用类似$this->display(#), $this->assign(#)的代码。
完成啦!接下来可以做一些测试,像这样。
如果一切顺利,你就能看到‘I am using Smarty with CI!’的字样啦!
2016年11月17日星期四
PHP include()和require()的区别
一、加载失败的处理方式不同
include()即使文件不存在,加载失败,也不会导致脚本停止运行,而是抛出一个PHP Warning。
而require()如果加载失败则直接抛出一个PHP Fatal error。导致脚本停止。
二、PHP性能影响不同
include()每次执行都要对文件进行读取和评估,而require只对文件处理一次(事实上,文件内容替换了require语句)。
三、使用弹性不同
require 的使用方法如 require("./inc.php"); 。通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它变成 PHP 程式网页的一部份。
include 使用方法如 include("./inc/.php"); 。一般是放在流程控制的处理区段中。PHP 程式网页在读到 include 的档案时,才将它读进来。这种方式,可以把程式执行时的流程简单化。
顺带一提,require_once() 和 include_once()和上述两种方法的不同之处就在于它们会判断文件是否已经包含在脚本中,如果已经包含则跳过该语句。一般建议使用_once()方法,可以避免重复包含文件导致的性能损失。
订阅:
评论 (Atom)