MYSQL的binary處理mysql數據年夜小寫敏感成績的辦法。本站提示廣大學習愛好者:(MYSQL的binary處理mysql數據年夜小寫敏感成績的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MYSQL的binary處理mysql數據年夜小寫敏感成績的辦法正文
mysql> select binary 'ABCD'='abcd' COM1, 'ABCD'='abcd' COM2;
+--------+-----------+
| COM1 | COM2 |
+--------+-----------+
| 0 | 1 |
+---------+-----------+
1 row in set (0.00 sec)
(僅唯一些罷了!4.*之前)
由於有的MySQL特殊是4.*之前的關於中文檢索會有禁絕確的成績,可以在檢索的時刻加上binary。
建表:
create TABLE usertest (
id int(9) unsigned NOT NULL auto_increment,
username varchar(30) NOT NULL default '',
primary key (id)
)
拔出數據:
insert into usertest (username) VALUES('美文');
insert into usertest (username) VALUES('美國項目');
insert into usertest (username) VALUES('李文');
insert into usertest (username) VALUES('老唐');
insert into usertest (username) VALUES('夢漂');
insert into usertest (username) VALUES('龍武');
insert into usertest (username) VALUES('夏');
例如:select * from usertest where username like '%夏%' ,成果七筆記錄都出來了,比擬愁悶。
假如應用=而不是like的時刻,select * from usertest where username = '夏' ,只湧現一個成果。由於mysql 的LIKE操作是依照ASCII 操作的,所以LIKE的時刻是能夠有成績的。成績持續:假如再加上:
insert into usertest (username) VALUES('文');
insert into usertest (username) VALUES('唐');
照樣應用select * from usertest where username = '夏' ,成果照樣湧現3筆記錄,又愁悶了。處理方法以下:
1.在create的時刻就應用binary,而不是在query的時刻加。
username varchar(30) BINARY NOT NULL default '', 假如表曾經建好了,應用:
alter table usertest modify username varchar(32) binary; 來就該表的屬性。
2.在query的時刻加上binary,select * from usertest where username like binary '%夏%' ,便可以精確的查詢出一筆記錄來。
char應用固定長度的空間停止存儲,char(4)存儲4個字符,依據編碼方法的分歧占用分歧的字節,gbk編碼方法,豈論是中文照樣英文,每一個字符占用2個字節的空間,utf8編碼方法,每一個字符占用3個字節的空間。
假如須要存儲的字符串的長度跟一切值的均勻長度相差不年夜,合適用char,如MD5。
關於常常轉變的值,char優於varchar,緣由是固定長度的行不輕易發生碎片。
關於很短的列,char優於varchar,緣由是varchar須要額定一個或兩個字節存儲字符串的長度。
varchar保留可變長度的字符串,應用額定的一個或兩個字節存儲字符串長度,varchar(10),除須要存儲10個字符,還須要1個字節存儲長度信息(10),跨越255的長度須要2個字節來存儲
破例:Myisam引擎中應用ROW_FORMAT=FIXED時,每行應用雷同的空間,形成糟蹋
char和varchar前面假如有空格,char會主動去失落空格後存儲,varchar固然不會去失落空格,但在停止字符串比擬時,會去失落空格停止比擬
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(4) | YES | | NULL | |
| addr | char(8) | YES | | NULL | |
| bn | varbinary(4) | YES | | NULL | |
| b | binary(8) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
+----------------------+----------------------+
| concat("$",name,"$") | concat("$",addr,"$") |
+----------------------+----------------------+
| $asdf$ | $a$ |
| $asdf$ | $a$ |
| $a $ | $a$ |
| $a$ | $a$ |
| $t a$ | $a$ |
+----------------------+----------------------+
mysql> select * from zcy where name='a '; //因為name是varchar,比擬時,'a '主動轉換為'a'
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
| 4 | a | a | ab | a |
+----+------+------+------+----------+
2 rows in set (0.00 sec)
mysql> select * from zcy where name='a';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
| 4 | a | a | ab | a |
+----+------+------+------+----------+
2 rows in set (0.00 sec)
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(4) | YES | | NULL | |
| addr | char(8) | YES | | NULL | |
| bn | varbinary(4) | YES | | NULL | |
| b | binary(8) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
+--------------------+-------------------+
| concat("$",bn,"$") | concat("$",b,"$") |
+--------------------+-------------------+
| $ab a$ | NULL |
| $ab $ | $ab $ |
| $ab$ | $ab $ |
| $ab $ | $a $ |
| NULL | $a $ |
| NULL | $abcde $ |
| NULL | $abcd1234$ |
+--------------------+-------------------+
binary保留二進制字符串,它保留的是字節而不是字符,沒有字符集限制
binary(8)可以保留8個字符,每一個字符占1個字節,共占8個字節
停止比擬時是按字節停止比擬,而不是按字符(char),按字節比擬比字符簡略疾速
按字符比擬不辨別年夜小寫,而binary辨別年夜小寫,開頭應用\0填充,而不是空格
mysql> select * from zcy where b='a\0\0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 5 | t a | a | NULL | a |
+----+------+------+------+----------+
mysql> select * from zcy where b='a \0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
varbinary保留變長的字符串,前面不會補\0
mysql> select * from zcy where bn='ab';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.01 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 2 | asdf | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.00 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
1 row in set (0.00 sec)
MySql中Blob與Text的差別
BLOB是一個二進制年夜對象,可以包容可變數目的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可包容值的最年夜長度分歧。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有雷同的最年夜長度和存儲需求。
BLOB 列被視為二進制字符串(字節字符串)。TEXT列被視為非二進制字符串(字符字符串)。BLOB列沒有字符集,而且排序和比擬基於列值字節的數值值。TEXT列有一個字符集,而且依據字符集的 校訂規矩對值停止排序和比擬。
在TEXT或BLOB列的存儲或檢索進程中,不存在年夜小寫轉換。
當未運轉在嚴厲形式時,假如你為BLOB或TEXT列分派一個跨越該列類型的最年夜長度的值值,值被截取以包管合適。假如截失落的字符不是空格,將會發生一條正告。應用嚴厲SQL形式,會發生毛病,而且值將被謝絕而不是截取並給出正告。
在年夜多半方面,可以將BLOB列視為可以或許足夠年夜的VARBINARY列。異樣,可以將TEXT列視為VARCHAR列。BLOB和TEXT在以下幾個方面分歧於VARBINARY和VARCHAR:
·當保留或檢索BLOB和TEXT列的值時不刪除尾部空格。(這與VARBINARY和VARCHAR列雷同)。
請留意比擬時將用空格對TEXT停止擴大以合適比擬的對象,正如CHAR和VARCHAR。
·關於BLOB和TEXT列的索引,必需指定索引前綴的長度。關於CHAR和VARCHAR,前綴長度是可選的。
·BLOB和TEXT列不克不及有 默許值。
LONG和LONG VARCHAR對應MEDIUMTEXT數據類型。這是為了包管兼容性。假如TEXT列類型應用BINARY屬性,將為列分派列字符集的二元 校訂規矩。
MySQL銜接法式/ODBC將BLOB值界說為LONGVARBINARY,將TEXT值界說為LONGVARCHAR。
因為BLOB和TEXT值能夠會異常長,應用它們時能夠碰到一些束縛:
·當排序時只應用該列的前max_sort_length個字節。max_sort_length的 默許值是1024;該值可以在啟動mysqld辦事器時應用--max_sort_length選項停止更改。
運轉時增長max_sort_length的值可以在排序或組應時使更多的字節成心義。任何客戶端可以更改其會話max_sort_length變量的值:
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM tbl_name
-> ORDER BY comment;
當你想要使跨越max_sort_length的字節成心義,對含長值的BLOB或TEXT列應用GROUP BY或ORDER BY的另外一種方法是將列值轉換為固定長度的對象。尺度辦法是應用SUBSTRING函數。例如,上面的語句對comment列的2000個字節停止排序:
mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name
-> ORDER BY SUBSTRING(comment,1,2000);
·BLOB或TEXT對象的最年夜年夜小由其類型肯定,但在客戶端和辦事器之間現實可以傳遞的最年夜值由可用內存數目和通訊緩存區年夜小肯定。你可以經由過程更改max_allowed_packet變量的值更改新聞緩存區的年夜小,但必需同時修正辦事器和客戶端法式。例如,可使用mysql和mysqldump來更改客戶真個max_allowed_packet值。
每一個BLOB或TEXT值分離由外部分派的對象表現。這與其它列類型構成比較,後者是當翻開表時為每1列分派存儲引擎。