Mysql 的編碼方式使得欄位內容不區分大小寫
造成儲存的時候按大小寫儲存,但是檢索的時候不區分大小寫. 這個也是在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的縮寫,即大小寫敏感。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql查詢欄位內容無法區分大小寫問題MySql
- 更改MySql表和欄位區分大小寫MySql
- 配置mysql不區分大小寫MySql
- mysql 表明不區分大小寫MySql
- MySQL不區分大小寫設定MySql
- 在oracle10g中可使得排序不區分大小寫Oracle排序
- 設定MYSQL不區分表大小寫MySql
- 更改MYSQL資料庫不區分大小寫MySql資料庫
- oracle 不區分大小寫Oracle
- MySQL表名不區分大小寫的設定方法MySql
- MySQL binary 區分大小寫MySql
- MySQL表名區分大小寫MySql
- 密碼區分大小寫密碼
- Nginx支援url不區分大小寫Nginx
- java ArrayList排序不區分大小寫Java排序
- vim 查詢不區分大小寫
- Mysql模糊查詢預設是不區分字母大小寫的MySql
- 設定Oracle的使用者密碼不區分大小寫Oracle密碼
- python中不區分大小寫嗎Python
- 使MySQL查詢區分大小寫(轉)MySql
- 配置CaseInsensitiveMap使key不區分大小寫
- SQL Server 2008 中SQL查詢語句中欄位值不區分大小寫問題處理SQLServer
- MySQL模糊查詢(like)時區分大小寫MySql
- Git 區分大小寫Git
- Nginx實現url請求不區分大小寫Nginx
- 修改Oracle11g使用者密碼不區分大小寫Oracle密碼
- MySQL資料庫中庫、表名、欄位的大小寫問題MySql資料庫
- MySQL的where條件字串區分大小寫的問題MySql字串
- 最新版idea不區分大小寫設定Idea
- 如何在MySQL中實現替換欄位部分內容MySql
- mysql修改某個欄位(替換關鍵字內容)MySql
- MySQL-去掉不為null的欄位MySqlNull
- Oracle 11gR2密碼區分大小寫Oracle密碼
- Oracle11g 特性——密碼區分大小寫Oracle密碼
- 11G開始 密碼區分大小寫密碼
- mysql 資料庫 表 欄位 編碼修改 方法MySql資料庫
- mongodb如何不區分大小寫MongoDB
- 查詢區分大小寫 (轉)