我在CAFE
字段mySQL表中插入了单词name
。
出乎意料的是,当我执行下面的语句
时,我得到一行包含CAFE
SELECT * FROM myTable where name='CAFÉ';
,这是错误的。在我的用例中,CAFE
不应等于CAFÉ
我想我在服务器端和客户端正确设置了所有编码:
服务器端:
修改/etc/mysql/my.cnf
我得到
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| 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)
+----------------------+-----------------+
| 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)
客户端:
connect = DriverManager
.getConnection("jdbc:mysql://"+serverName+"/" +
dataBaseName + "?characterEncoding=utf8&user=" + userName + "&password=" + password);
P.S。有许多类似于此的重复问题,但没有一个问题能够回答我遇到的问题。
答案 0 :(得分:2)
排序utf8_general_ci
(_ci
代表Case Insensitive)不仅使e
等于E
,还使E
等于{{1} }}。要使select语句区分大小写,可以使用this answer:
É
如果您希望列SELECT * FROM myTable where BINARY name='CAFÉ';
中的数据始终区分大小写,请使用区分大小写的name
排序规则,如this问题的答案所示。例如。创建表时,请使用:
_bin
答案 1 :(得分:0)
归功于@vanOekel评论
在创建表时添加CHARACTER SET utf8 COLLATE utf8_bin
解决了我的问题
CREATE TABLE myTable (
name CHAR(100) NOT NULL,
CONSTRAINT uc__name UNIQUE (name)
) CHARACTER SET utf8 COLLATE utf8_bin ENGINE=MyISAM;
现在在我的表格中,我可以同时拥有CAFE
和CAFÉ
,而无需在name
字段上跳过唯一约束。