深入研究mysql中的varchar與limit(容易被忽略的知識(shí))_MySQL教程
推薦:Mysql下建立用戶(hù)授權(quán)權(quán)限例子用戶(hù)授權(quán)在mysql中使用grant命令就可以了,我相信各位都會(huì)有了解過(guò)了,下面小編為各位介紹一個(gè)Mysql下建立用戶(hù)授權(quán)權(quán)限例子,希望本文章對(duì)各位有幫助. 建立用戶(hù),授權(quán)數(shù)據(jù)庫(kù): mysql create user 'byrd'@'localhost' identified by 'admin123'; #建立主機(jī)為localhost,
為什么標(biāo)題要起這個(gè)名字呢?commen sence指的是那些大家都應(yīng)該知道的事情,但往往大家又會(huì)會(huì)略這些東西,或者對(duì)這些東西一知半解,今天我總結(jié)下自己在mysql中遇到的一些commen sense類(lèi)型的問(wèn)題。
1、varchar(5)可以存儲(chǔ)多少個(gè)漢字,多少個(gè)字母數(shù)字?
相信有好多人應(yīng)該跟我一樣,對(duì)這個(gè)已經(jīng)很熟悉了,根據(jù)經(jīng)驗(yàn)我們能很快的做出決定,比如說(shuō)用varchar(200)去存儲(chǔ)url等等,但是,即使你用了很多次也很熟悉了,也有可能對(duì)上面的問(wèn)題做出錯(cuò)誤的回答。
這個(gè)問(wèn)題我查了好多資料,有的人說(shuō)是可以存儲(chǔ)5個(gè)字符,2.5個(gè)漢字(每個(gè)漢字占用兩個(gè)字節(jié)的話),有的人說(shuō)這個(gè)要區(qū)分版本,5.0是個(gè)分界限,5.0之前是前面說(shuō)的那樣,5.0之后是可以存儲(chǔ)5個(gè)“字”,不區(qū)分是數(shù)字、英文、漢字,果真是這樣嗎,我們來(lái)做個(gè)實(shí)驗(yàn):
代碼如下:CREATE TABLE `test` (
`name` varchar(5) NOT NULL DEFAULT '',
`info` char(5) NOT NULL DEFAULT '',
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
可以看出varchar(5)中的5代表的是5個(gè)“字”,而不是5個(gè)字節(jié)(bytes),當(dāng)我們存儲(chǔ)長(zhǎng)度超過(guò)制定長(zhǎng)度的時(shí)候會(huì)將超過(guò)的部分“咔嚓”掉,我的mysql版本是5.6,字符集(charset)utf8與gbk是一樣的。

其他版本我電腦上沒(méi)有,去官方文檔看看有沒(méi)有什么說(shuō)明,在官方文檔中查了半天終于發(fā)現(xiàn)了點(diǎn)不同:
下面這段來(lái)自http://dev.mysql.com/doc/refman/4.1/en/char.html,是對(duì)mysq4.1的說(shuō)明:
代碼如下:
The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters. (Before MySQL 4.1, the length is interpreted as number of bytes.)
再看看其他版本的類(lèi)似的說(shuō)明:
代碼如下:
The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.
顯而易見(jiàn)了,官方文檔說(shuō)了,mysql版本小于4.1的時(shí)候存儲(chǔ)的時(shí)候符合說(shuō)法:varchar(5)保存5個(gè)bytes,及5個(gè)英文數(shù)字或者2.5個(gè)漢字(假設(shè)一個(gè)漢字2個(gè)字節(jié));
mysql版本大于等于4.1的時(shí)候varchar(5)中的5不再是字節(jié)數(shù)了,應(yīng)該理解為“字”這里的字的意思是一個(gè)漢字與一個(gè)英文或者數(shù)字“相同對(duì)待”
2、mysql中的limit,你真的會(huì)用嗎?
你在項(xiàng)目中如何使用limit?limit num?還是limit num1,num2?還是其他的?要知道limit使用區(qū)別的形式性能差距很大的。
我自己測(cè)試了下,在一張innodb表中去使用limit,表中10000條數(shù)據(jù),四個(gè)字段,id(int)、time(int)、title(varchar)、body(mediumtext),大小大約170M左右,首先關(guān)掉查詢(xún)緩存,免得查詢(xún)緩存對(duì)查詢(xún)時(shí)間有影響,這里要注意time字段上面加了索引,
代碼如下:
SET @@query_cache_type=ON;
SET GLOBAL query_cache_size=0;
打開(kāi)Query profiler來(lái)查看語(yǔ)句執(zhí)行所花費(fèi)的時(shí)間
set profiling=1;
接下來(lái)對(duì)下面幾個(gè)語(yǔ)句進(jìn)行執(zhí)行
代碼如下:
a、SELECT id,TIME,title FROM cnblogs WHERE TIME>=1315646940 ORDER BY TIME ASC LIMIT 2000,10
b、SELECT id,TIME,title FROM cnblogs WHERE TIME>=1315646940 ORDER BY TIME ASC LIMIT 10
c、 SELECT id,TIME,title FROM cnblogs ORDER BY TIME ASC LIMIT 3000,10
執(zhí)行順序a,b,c,a,b,c,c,a,a(這里需要注意下,雖然我關(guān)閉了緩存,但是上一次的查詢(xún)還是會(huì)緩存,這個(gè)可以從Query profiler中看出來(lái),所以進(jìn)行交叉執(zhí)行),使用下面的語(yǔ)句查看結(jié)果
代碼如下:
SHOW profiles;
從上面的語(yǔ)句執(zhí)行時(shí)間分析可以看出,不考慮緩存因素,當(dāng)使用limit的時(shí)候,"limit begin,num"這種形式比"limit num"這種形式效率低很多,因此,在使用的時(shí)候盡可能的使用第二種形式,比如說(shuō)要循環(huán)獲取一個(gè)表里面的數(shù)據(jù),一次取出來(lái)內(nèi)從放不下,這個(gè)時(shí)候就要按照id(或者其他排序字段)進(jìn)行l(wèi)imit了,我們就可以通過(guò)獲取上次的該字段臨界值作為下次取數(shù)據(jù)的最小值,使用limit num這種形式效率會(huì)高很多。
分享:mysql中alter數(shù)據(jù)表中增加、刪除字段與表名修改例子alter是非常強(qiáng)大的一個(gè)功能我們可以利用alter來(lái)修改數(shù)據(jù)表表名字體名及一些其它的操作了,下面一起來(lái)看看mysql中alter數(shù)據(jù)表中增加、刪除字段與表名修改的一個(gè)例子. 修改刪除mysql數(shù)據(jù)庫(kù)中的數(shù)據(jù)內(nèi)容: [root@hk ~]# /usr/local/mysql/bin/mysql -uroot -p'admin' #進(jìn)
- Mysql下建立用戶(hù)授權(quán)權(quán)限例子
- mysql中alter數(shù)據(jù)表中增加、刪除字段與表名修改例子
- Mysql大小寫(xiě)敏感的問(wèn)題
- 給Mysql添加遠(yuǎn)程訪問(wèn)權(quán)限的方法
- mysql生成隨機(jī)字符串函數(shù)分享
- mysql誤刪root用戶(hù)恢復(fù)方法
- MySQL編程中的6個(gè)實(shí)用技巧
- Centos中徹底刪除Mysql(rpm、yum安裝的情況)
- Mysql修改datadir導(dǎo)致無(wú)法啟動(dòng)問(wèn)題解決方法
- mysql 查詢(xún)重復(fù)的數(shù)據(jù)的SQL優(yōu)化方案
- mysql的左右內(nèi)連接用法實(shí)例
- mysql中You can’t specify target table for update in FROM clau
MySQL教程Rss訂閱編程教程搜索
MySQL教程推薦
- Centos5.5中安裝Mysql5.5過(guò)程分享
- mysql的左右內(nèi)連接用法實(shí)例
- 深入SQLite基本操作的總結(jié)詳解
- 解析mysql與Oracle update的區(qū)別
- MySql大批量導(dǎo)入數(shù)據(jù)優(yōu)化
- mysql存儲(chǔ)過(guò)程,實(shí)現(xiàn)兩個(gè)游標(biāo)的循環(huán)
- MySQL錯(cuò)誤Forcing close of thread的兩種解決方法
- 總結(jié)mysql服務(wù)器查詢(xún)慢原因
- 如何從Windows命令行啟動(dòng)MySQL
- 把視頻文件直接存儲(chǔ)到mysql數(shù)據(jù)庫(kù)的方法
猜你也喜歡看這些
- SQL Server 2008中的新日期數(shù)據(jù)類(lèi)型
- 詳解優(yōu)化SQL Server數(shù)據(jù)庫(kù)的方法
- sql server查詢(xún)時(shí)間技巧分享
- 解析SQL Server數(shù)據(jù)應(yīng)用在不同的數(shù)據(jù)庫(kù)中
- 淺談SQL Server數(shù)據(jù)庫(kù)優(yōu)化經(jīng)驗(yàn)總結(jié)
- 總結(jié)經(jīng)典常用的SQL語(yǔ)句(2)
- 如何查看并導(dǎo)出數(shù)據(jù)表中字段的注釋信息
- 談SQL Server數(shù)據(jù)庫(kù)管理常用的SQL和T-SQL語(yǔ)句
- 詳解SQL Server 2008安裝過(guò)程
- sql2008啟動(dòng)代理未將對(duì)象應(yīng)用到實(shí)例解決方案
- 相關(guān)鏈接:
- 教程說(shuō)明:
MySQL教程-深入研究mysql中的varchar與limit(容易被忽略的知識(shí))
。