即使在正确设置编码后,也无法在mysql中插入CAFÉ

时间:2014-01-13 22:19:39

标签: java mysql sql encoding utf-8

我在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。有许多类似于此的重复问题,但没有一个问题能够回答我遇到的问题。

2 个答案:

答案 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;

现在在我的表格中,我可以同时拥有CAFECAFÉ,而无需在name字段上跳过唯一约束。