Mysql 的編碼方式使得欄位內容不區分大小寫

xchui702發表於2016-08-19
造成儲存的時候按大小寫儲存,但是檢索的時候不區分大小寫. 這個也是在Oracle的預設情況不一致的,oracle 統一使用區分大小寫的編碼方式。所以在預設情況和oracle資料庫是有區別的。
1. 插入 'Ab', 'ab'兩條記錄
root@test 09:11:51>insert into test values(3, 'Ab');
Query OK, 1 row affected (0.01 sec)


root@test 09:12:15>insert into test values(3,'ab');
Query OK, 1 row affected (0.01 sec)


root@test 09:12:39>select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa11 |
|    2 | 1234 |
|    3 | Ab   |
|    3 | ab   |
+------+------+
4 rows in set (0.00 sec)
2. 按 'ab'檢索返回兩條記錄,如果是Oracle則只會返回一條資料。
root@test 09:12:43>select * from test where name='ab';
+------+------+
| id   | name |
+------+------+
|    3 | Ab   |
|    3 | ab   |
+------+------+
2 rows in set (0.00 sec)


3. 檢視gbk的當前編碼格式COLLATION是gbk_chinese_ci, 即大小寫不敏感, 儲存的二進位制編碼都是一樣的,
 所以在where子句中傳入'ab', 'aB',都會事先翻譯成相同的編碼,所以返回兩條記錄。
root@information_schema 10:13:57>select * from tables where table_schema='test' and table_name='TEST' \G
*************************** 1. row ***************************
  TABLE_CATALOG: def
   TABLE_SCHEMA: test
     TABLE_NAME: test
     TABLE_TYPE: BASE TABLE
         ENGINE: InnoDB
        VERSION: 10
     ROW_FORMAT: Compact
     TABLE_ROWS: 5
 AVG_ROW_LENGTH: 3276
    DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
   INDEX_LENGTH: 0
      DATA_FREE: 0
 AUTO_INCREMENT: NULL
    CREATE_TIME: 2016-08-18 11:14:42
    UPDATE_TIME: NULL
     CHECK_TIME: NULL
TABLE_COLLATION: gbk_chinese_ci
       CHECKSUM: NULL
 CREATE_OPTIONS:
  TABLE_COMMENT:


--證明都是按小寫來儲存的。
root@information_schema 10:23:02>select ascii(name), id from test.test;
+-------------+------+
| ascii(name) | id   |
+-------------+------+
|          97 |    1 |
|          49 |    2 |
|          65 |    3 |
|          97 |    3 |
|          49 |   12 |
+-------------+------+


4. 如何設定好資料庫,使得能夠對於欄位值區分大小寫: 要把編碼模式設定為非預設值的COLLATE=gbk_bin
root@test 01:34:58>create table a(name varchar(10) ) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin;
Query OK, 0 rows affected (0.01 sec)


root@test 01:35:06>insert into a values('a');
Query OK, 1 row affected (0.00 sec)


root@test 01:35:16>insert into a values('A');
Query OK, 1 row affected (0.00 sec)


root@test 01:35:20>select * from a where name='a';
+------+
| name |
+------+
| a    |
+------+
1 row in set (0.00 sec)


root@test 01:35:30>select * from a where name='A';
+------+
| name |
+------+
| A    |
+------+
1 row in set (0.00 sec)


root@test 01:35:35>create table b (name varchar(10));
Query OK, 0 rows affected (0.00 sec)




備註: 
utf8_bin將字串中的每一個字元用二進位制資料儲存,區分大小寫。


utf8_genera_ci不區分大小寫,ci為case insensitive的縮寫,即大小寫不敏感。


utf8_general_cs區分大小寫,cs為case sensitive的縮寫,即大小寫敏感。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/674865/viewspace-2123722/,如需轉載,請註明出處,否則將追究法律責任。

相關文章