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
- python中不區分大小寫嗎Python
- Nginx支援url不區分大小寫Nginx
- 設定Oracle的使用者密碼不區分大小寫Oracle密碼
- 配置CaseInsensitiveMap使key不區分大小寫
- 區分大小寫
- Git 區分大小寫Git
- 最新版idea不區分大小寫設定Idea
- MySQL的where條件字串區分大小寫的問題MySql字串
- mysql修改某個欄位(替換關鍵字內容)MySql
- 如何在MySQL中實現替換欄位部分內容MySql
- [20220826]ls顯示檔案不區分大小寫.txt
- IDEA-idea設定導航欄字型大小程式碼編輯區字型大小Idea
- SQL Server 解決不區分中英文大小寫方法SQLServer
- MySQL-去掉不為null的欄位MySqlNull
- mongodb如何不區分大小寫MongoDB
- select,value,pluck 欄位區分
- mysql 如何替換資料表欄位字串中指定單詞的內容MySql字串
- 模糊查詢區分大小寫嗎?
- Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!Elasticsearch
- 短視訊app開發,顯示文字高亮,不區分大小寫APP
- mysql 計算 一個文字欄位的內容一個文字出現的次數MySql
- python excel 內容寫入mysqlPythonExcelMySql
- Pycharm-Pycharm設定左側導航欄字型大小和程式碼編輯區字型大小PyCharm
- Python實用技法第25篇:正則:以不區分大小寫的方式對文字做查詢和替換Python
- springboot~ConstraintValidatorContext驗證兩個欄位內容相同Spring BootAIContext
- mysql group_concat 實現把分組欄位寫成一行的方法MySql
- uniapp獲取通知欄內容 監聽通知欄內容APP
- 帝國CMS 批次修改欄位內容sql語句SQL
- MongoDB查詢如何只輸出部分欄位內容MongoDB
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- MySQL:count(*) count(欄位) 實現上區別MySql
- 使用SQL語言 替換資料庫某欄位內的部分內容SQL資料庫
- mysql 字串型別的數值欄位按照數值的大小進行排序MySql字串型別排序
- Linux命令列:對內容進行大小寫字元轉換 Linux命令列字元
- MySQL5.7密碼欄位變更MySql密碼
- Git中如何設定區分檔名大小寫Git