【发布时间】:2013-01-31 22:07:30
【问题描述】:
这是一个奇怪的谜题,AFAIK utf8_bin 应该保证每个口音都正确存储在数据库中,即没有一些奇怪的 ASCII 转换。所以我有这样的表:
DEFAULT CHARSET=utf8 COLLATE=utf8_bin
然而,当我尝试根据 MySQL 比较/查询/诸如“Krąków”和“Kraków”之类的条目时,这是相同的字符串。
出于好奇,我也尝试了 utf8_polish,MySQL 声称对于波兰人来说,“a”和“ą”没有任何区别。
那么如何设置 MySQL 表,以便我可以安全地存储 unicode 字符串,而不会丢失重音等?
服务器:MySQL 5.5 + openSUSE 11.4,客户端:Windows 7 + MySQL Workbench 5.2。
更新 -- 创建表
CREATE TABLE `Cities` (
`city_Name` VARCHAR(145) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`city_Name`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
请注意,我不能为列设置 不同 utf8_bin,因为整个表都是 utf8_bin,所以实际上列的排序规则被重置为默认值。
【问题讨论】:
-
这是设计使然。您不会失去重音,只是在比较它们时非常宽容。等等,找个骗子....
-
好吧,我找不到好的副本,我懒得翻遍 10 页。一般的答案是,您需要使用
utf8_bin排序规则进行重音和区分大小写的比较,或者作为表的排序规则,或者在比较时使用COLLATE utf8_bin;。我不确定这是否是这个问题的最终决定,或者是否有对口音敏感的国家排序规则,但这就是所有答案所暗示的。 -
@Pekka웃,我为整个表设置了 utf8_bin,现在我还为特定列设置了 utf8_bin。然而,对于 MySQL,“a”仍然是“±”。 更新:实际上没有区别,因为如果有人对列使用默认值,则更改整个表排序规则也会更改列排序规则。
-
您可以在列规范本身中指定排序规则,例如
columnname VARCHAR(100) CHARSET utf8 COLLATE utf8_bin NOT NULL。DEFAULT设置是在创建时获取的,但在创建列后更改它不会执行任何操作。使用SHOW CREATE TABLE tablename查看现有列的字符集/排序规则。
标签: mysql unicode utf-8 collation diacritics