我有一张table叫“标签”。其结构如下:
CREATE TABLE `tags` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`value` varchar(255) COLLATE utf8_bin NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `tags_name_value_unique` (`name`,`value`),
KEY `tags_name_index` (`name`),
KEY `tags_value_index` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=1380 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
得到不同值的相似误差。这种错误是经常发生的,但却是随机的
sqlstate[23000]:完整性约束冲突:1062键“tags\u name\u value\u unique”的重复条目“screen\u name-erika s”(sql:insert-into) tags
( name
, value
, updated_at
, created_at
)值(屏幕名称,erika s)öll,2018-08-29 08:21:55,2018-08-29 08:21:55)
在本例中,值erika söll在db中不存在,而erika s的值在db中可用。我有以下问题:
插入是用值erika s完成的ö那么为什么唯一的约束会给erika s带来错误呢?
这样的错误有成千上万个,经过分析,似乎在出现任何类似的德语字符之前,值是匹配的ö, ü, ß, 等等。为什么索引的行为是这样的?
这与同时使用唯一约束和索引有关吗?在这种情况下,首先创建索引,然后添加唯一约束
如何修复?
选择和插入值的查询如下: select * from
标签 where (
名称 = 'screen_name' and
价值
= 'Klaudia-Krauß') limit 1 insert into
标签 (
名称 ,
价值 ,
更新时间 ,
创建于 ) values ('screen_name', 'Klaudia-Krauß', '2018-09-03 04:08:46', '2018-09-03 04:08:46')
2条答案
按热度按时间zsohkypk1#
插入表格时,“erika sö“ll”被截断为“erika s”,也就是说,就在第一个重音字母之前。这是一个字符集问题。更多讨论如下:
要存储的字节不编码为utf8。修好这个。
另外,检查读取期间的连接是否为utf8。
如果不知道您是否在使用php、java、python等,我就不能说得更具体了。不过,这里可能有一些提示。
同时,也许你不需要
id
总之,这4个索引可以简化为两个:dsf9zpds2#
我面临着php和mysql结合的问题。这个问题与数据编码有关。我收到的数据是utf8和其他编码的混合,在我的例子中是iso-8859-1。所以作为一个修正,我写了下面的代码解决了我的问题
这个
mb_check_encoding($input, 'UTF-8')
检查是为了避免编码已经是utf8编码的字符串。