【发布时间】:2014-01-13 22:19:38
【问题描述】:
我在 name 字段 mySQL 表中插入了单词 CAFE。
没想到,当我执行下面的语句时,我得到一行包含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);
附言有许多与此类似的重复问题,但没有一个回答具体到我遇到的问题。
【问题讨论】:
-
远射,但您是否也尝试过此答案中描述的解决方案:stackoverflow.com/a/5629121/3080094?
-
+1 在
WHERE工作后使用BINARY,即它能够区分CAFE 和CAFÉ。谢谢你。现在,我必须弄清楚如何在表中插入 CAFÉ 而不会触发名称的唯一约束。 -
您可以制作 VARBINARY 类型的列,但是您必须格外小心字符集(所有客户端都需要使用相同的字符集)。作为替代方案,这些答案可能很有趣:stackoverflow.com/a/458544/3080094stackoverflow.com/a/264389/3080094
-
这些都是很好的信息,请作为答案发布。
-
很高兴它成功了,我已经发布了答案(在您测试了解决方案之后,谢谢)。
标签: java mysql sql encoding utf-8