數據由Oracle 遷入MySQL ,由於之前Oracle區分大小寫,MySQL的配置使用了默認配置,導致一些數據導入失敗,有的唯一鍵報錯,衝突。
將測試過程記錄在下面。
數據庫版本:MySQL 5.7.11
引用他人博客中內容:
校對規則一般有這些特徵:
兩個不同的字符集不能有相同的校對規則。
每個字符集有一個默認校對規則。例如,utf8默認校對規則是utf8_general_ci。
存在校對規則命名約定:它們以其相關的字符集名開始,通常包括一個語言名,並且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束。
查看支持的校驗規則:
mysql> SHOW COLLATION like 'utf8%'; +--------------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | ... | utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 | | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | | utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |
查看本地的校驗規則: mysql> show global variables like '%coll%'; +----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +----------------------+--------------------+
生產中數據庫使用的編碼爲utf8mb4, 校驗規則爲 utf8mb4_unicode_ci,對大小寫不敏感
如果需要大小寫敏感,需要將排序規則修改爲utf8mb4_bin.
測試後結果:修改數據庫配置後,不會對已經存在的表造成影響,如要生效需要修改特定列的排序規則。優先級大概是這樣:列>表>數據庫>服務器
有兩種方法使查詢區分大小寫:
第一種方法爲修改列級別的校驗規則爲utf8mb4_bin
T表
CREATE TABLE `T` ( `name` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci mysql> select * from T; +------+ | name | +------+ | YOU | | You | | you | | you | | yOU | +------+
T2表:將列校對規則修改爲utf8mb4_bin
CREATE TABLE `T2` ( `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci mysql> select * from T2; +------+ | name | +------+ | yOU | | you | +------+
查詢:
T:(未區分大小寫)
mysql> select * from T where name = 'you'; +------+ | name | +------+ | YOU | | You | | you | | you | | yOU | +------+
T2:(已經區分大小寫)
mysql> select * from T2 where name = 'you'; +------+ | name | +------+ | you | +------+
第二種方法: 不修改配置,表結構,而使用如下的查詢語句:
T:(未修改表)
mysql> select * from T where name = binary'you'; +------+ | name | +------+ | you | | you | +------+