【问题标题】:MySQL Not Distinguishing Between 'e' and 'é' (using JDBC)MySQL 不区分“e”和“é”(使用 JDBC)
【发布时间】:2013-02-13 16:31:23
【问题描述】:

我正在使用 UTF-8 排序数据库,这是一个应该能够区分“e”和“é”的字符集...不幸的是,从 MySQL Workbench 和/或 JDBC 发出以下 2 个插入直接

INSERT INTO `ucap_i10_13_02_27$12_48_41`.`attributes` (`attribute`, `intvalue`) VALUES ('brown-séquard', 1);


INSERT INTO `mytable`.`attributes` (`attribute`, `intvalue`) VALUES ('brown-sequard', 1);

将“属性”列作为表中唯一的主键会导致...

Error Code: 1062 : Duplicate entry 'brown-sequard' for key 'PRIMARY'

此外,在发出第一个重音插入后,对非重音版本进行查询,例如:

select * from `mytable`.`attributes` where attribute='brown-sequard';

将返回重音版本 'brown-séquard。

如何确保 MySQL 识别重音字符和非重音字符在主键约束方面的区别?

更新 1

我尝试了在 StackOverflow 帖子中找到的解决方案:

É vs. E in MySQL database

那是我加了参数

&useUnicode=true&characterEncoding=UTF-8

到我的 JDBC 连接字符串。这没有帮助:-(

更新 2

当我从命令行 mysql 客户端而不是 MySQL Workbench 运行带有重音“e”'(brown-séquard') 的插入命令时,我收到以下有趣的错误代码:

ERROR 1366 (HY000): Incorrect string value: '\x82quard' for column 'attribute' at row 1

但我怀疑这与 windows 命令 shell/CLI 客户端阻塞重音编码而不是数据库连接本身有关。

【问题讨论】:

  • dev.hubspot.com/blog/bid/7049/MySQL-and-Unicode-Three-Gotchas 最后一个“陷阱”可能会有所帮助。也许您的character_set_client 仍设置为latin1
  • 谢谢,这很有道理!我唯一剩下的问题是这篇文章涵盖了更改 MySQL 命令提示符的“客户端字符集”...... JDBC 中是否有并行设置/变量?我正在研究它,但还没有发现任何东西。

标签: mysql jdbc primary-key


【解决方案1】:

您遇到的情况与字符排序有关,即the way MySQL compares characters

您可以在查询中use COLLATE clause 强制使用特定排序规则来执行此查询,或更改表定义中的列排序规则,使其始终以一种或另一种方式使用。

【讨论】:

  • 正确!我将模式创建命令从“CREATE SCHEMA my_schema CHARACTER SET utf8”更改为“CREATE SCHEMA my_schema CHARACTER SET utf8 COLLATE utf8_bin”,现在它就像一个魅力。我认为如果我也使用更具体的 ALTER/CREATE TABLE 命令来完成它,它也会起作用。感谢您的帮助!
猜你喜欢
  • 2011-09-21
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2011-01-28
  • 2011-10-18
相关资源
最近更新 更多