程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中查詢的有關英文字母年夜小寫成績的剖析

MySQL中查詢的有關英文字母年夜小寫成績的剖析

編輯:MySQL綜合教程

MySQL中查詢的有關英文字母年夜小寫成績的剖析。本站提示廣大學習愛好者:(MySQL中查詢的有關英文字母年夜小寫成績的剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中查詢的有關英文字母年夜小寫成績的剖析正文


mysql數據庫在做查詢時刻,有時刻是英文字母年夜小寫敏感的,有時刻又不是的,重要是由mysql的字符校驗規矩的設置決議的,平日默許是不支撐的年夜小寫字母敏感的。

 1. 甚麼是字符集和校驗規矩?

字符集是一套符號和編碼。校訂規矩是在字符集內用於比擬字符的一套規矩。任何一個給定的字符集至多有一個校訂規矩,它能夠有幾個校訂規矩。要想列出一個字符集的校訂規矩,應用SHOW COLLATION語句。

201557101023879.png (620×262)

校訂規矩普通有這些特點:

    兩個分歧的字符集不克不及有雷同的校訂規矩。
    每一個字符集有一個默許校訂規矩。例如,utf8默許校訂規矩是utf8_general_ci。
    存在校訂規矩定名商定:它們以其相干的字符集名開端,平日包含一個說話名,而且以_ci(年夜小寫不敏感)、_cs(年夜小寫敏感)或_bin(二元)停止。

2. 分歧級其余字符集和校驗規矩可掌握年夜小寫敏感

MySQL5.1在統一台辦事器、統一個數據庫或乃至在統一個表中應用分歧字符集或校訂規矩來混雜界說字符串。字符集和校訂規矩有4個級其余默許設置:辦事器級、數據庫級、表級和銜接級。

2.1辦事器級

MySQL依照以下辦法肯定辦事器字符集和辦事器校訂規矩:

(1)修正設置裝備擺設文件/etc/my.cnf

在[mysqld]下添加:collation_server = utf8_bin

重啟實例

https://www.aspphp.online/shujuku/UploadFiles_3118/201707/2017072814382015.png (405×125)

更改辦事器級的校驗規矩(collation_server )後,數據庫校驗規矩(collation_collation)默許會繼續辦事器級的。

留意:

這個只實用於在從新啟動以後, 新建的庫,已存在的庫不受影響.

異樣的, 即便庫的校驗規矩改了,曾經存在的表不受修正影響;

同理與曾經存在的列...

mysql> create database yutest0;
Query OK, 1 row affected (0.00 sec)
mysql> use yutest0;
Database changed
mysql> create table t1 (name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values('AAA');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values('aaa');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+
| name |
+------+
| AAA |
| aaa |
+------+
2 rows in set (0.00 sec)

mysql> select * from t1 where name='aaa';
+------+
| name |
+------+
| aaa |
+------+
1 row in set (0.00 sec)

可以看出,在辦事器級停止響應的校訂規矩設置,查詢年夜小寫敏感。

(2)當辦事器啟動時依據有用的選項設置

當啟動mysqld時,依據應用的初始選項設置來肯定辦事器字符集和校訂規矩。

shell> mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci

2.2數據庫級

MySQL如許選擇數據庫字符集和數據庫校訂規矩:

    假如指定了character set X和collate Y,那末采取字符集X和校訂規矩Y。
    假如指定了character set X而沒有指定collate Y,那末采取character set X和character set X的默許校訂規矩。
    不然,采取辦事器字符集和辦事器校訂規矩。

(1)修正設置裝備擺設文件/etc/my.cnf

停止了兩組測試:

1) 在[mysqld]下添加:

collation_server = utf8_bin

collation_database = utf8_bin

2) 在[mysqld]下添加:

collation_database = utf8_bin

重啟實例,兩組都不克不及正常啟動,毛病信息以下:

201557101355011.png (772×63)

可見,my.cnf設置裝備擺設文件中不支撐設置collation_database 變量。

(2)創立數據庫時設置數據庫校驗規矩

mysql> create database yutest default character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name    | Value      |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database  | utf8_bin    |
| collation_server   | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| abc |
+------+
2 rows in set (0.00 sec)

mysql> select * from t1 where name='abc';
+------+
| name |
+------+
| abc |
+------+
1 row in set (0.01 sec)

可以看出,在數據庫級停止響應的校訂規矩設置,查詢年夜小寫敏感。

2.3表級

MySQL依照上面的方法選擇表字符集和校訂規矩:

    假如指定了character set X和collate Y,那末采取character set X和collate Y。
    假如指定了character set X而沒有指定collate Y,那末采取character set X和character set X的默許校訂規矩。
    不然,采取數據庫字符集和辦事器校訂規矩。

在創立表時設置表級校驗規矩:

mysql> create database yutest2;
Query OK, 1 row affected (0.01 sec)
mysql> use yutest2;
Database changed

mysql> create table t1(name varchar(10))
  -> default character set utf8 collate utf8_bin;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values('ABC');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values('abc');
Query OK, 1 row affected (0.00 sec)

mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name    | Value      |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database  | utf8_general_ci |
| collation_server   | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| abc |
+------+
2 rows in set (0.00 sec)

mysql> select * from t1 where name='abc';
+------+
| name |
+------+
| abc |
+------+
1 row in set (0.00 sec)

可以看出,在表級停止響應的校訂規矩設置,查詢年夜小寫敏感。

2.4 銜接級

斟酌甚麼是一個“銜接”:它是銜接辦事器時所作的工作。客戶端發送SQL語句,例如查詢,經由過程銜接發送到辦事器。辦事器經由過程銜接發送呼應給客戶端,例如成果集。關於客戶端銜接,如許會招致一些關於銜接的字符集和校訂規矩的成績,這些成績均可以或許經由過程體系變量來處理:

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name      | Value           |
+--------------------------+----------------------------+
| character_set_client   | utf8            |
| character_set_connection | utf8            |
| character_set_database  | utf8            |
| character_set_filesystem | binary           |
| character_set_results  | utf8            |
| character_set_server   | utf8            |
| character_set_system   | utf8            |
| character_sets_dir    | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

    當查詢分開客戶端後,在查詢中應用哪一種字符集?

辦事器應用character_set_client變量作為客戶端發送的查詢中應用的字符集。

    辦事器吸收到查詢後應當轉換為哪一種字符集?

轉換時,辦事器應用character_set_connection和collation_connection體系變量。它將客戶端發送的查詢從character_set_client體系變量轉換到character_set_connection。

    辦事器發送成果集或前往毛病信息到客戶端之前應當轉換為哪一種字符集?

character_set_results變量指導辦事器前往查詢成果到客戶端應用的字符集。包含成果數據,例如列值和成果元數據(如列名)。

3. 創立數據庫表時年夜小寫不敏感,依然無方法在查詢時辨別年夜小寫

3.1 在SQL語句中應用collate

應用collate子句,可以或許為一個比擬籠罩任何默許校訂規矩。collate可以用於多種SQL語句中,好比where,having,group by,order by,as,聚合函數。

mysql> select * from t1 where name collate utf8_bin = 'ABC';
+------+
| name |
+------+
| ABC |
+------+
1 row in set (0.00 sec)

mysql> select * from t1 where name = 'ABC';
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)

mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)

3.2 binary操作符

binary操作符是collate子句的一個速記符。binary 'x'等價與'x' collate y,這裡y是字符集'x'二元校訂規矩的名字。每個字符集有一個二元校訂規矩。例如,latin1字符集的二元校訂規矩是latin1_bin,是以,假如列a是字符集latin1,以下兩個語句有雷同後果:

select * from t1 order by binary a;

select * from t1 order by a collate latin1_bin;

mysql> select * from t1 where binary name = 'ABC';
+------+
| name |
+------+
| ABC |
+------+
1 row in set (0.00 sec)
mysql>
mysql> select * from t1 where name = 'ABC';
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved