【问题标题】:Not able to insert CAFÉ in mysql, even after setting encoding correctly即使正确设置编码后,也无法在 mysql 中插入 CAFÉ
【发布时间】: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


【解决方案1】:

排序规则utf8_general_ci(_ci 代表不区分大小写)不仅使e 等于E,而且还使E 等于É。要使 select 语句区分大小写,您可以使用this 答案中的解决方案:

SELECT * FROM myTable where BINARY name='CAFÉ';

如果您想让name 列中的数据始终区分大小写,请使用区分大小写的_bin 排序规则,如this 问题的答案所示。例如。创建表时,请使用:

CREATE TABLE myTable (
...
) CHARACTER SET utf8 COLLATE utf8_bin ENGINE=MyISAM;

【讨论】:

    【解决方案2】:

    感谢@vanOekel cmets

    在创建表时添加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 字段上的唯一约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多