复合唯一约束在不存在值时给出错误(utf8字符串被截断)

wwodge7n  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(346)

我有一张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')

disbfnqx

disbfnqx1#

我面临着php和mysql结合的问题。这个问题与数据编码有关。我收到的数据是utf8和其他编码的混合,在我的例子中是iso-8859-1。所以作为一个修正,我写了下面的代码解决了我的问题

public static function convertToUTF8($input)
{
    return !mb_check_encoding($input, 'UTF-8') ? utf8_encode($input) : $input;
}

这个 mb_check_encoding($input, 'UTF-8') 检查是为了避免编码已经是utf8编码的字符串。

uurity8g

uurity8g2#

插入表格时,“erika sö“ll”被截断为“erika s”,也就是说,就在第一个重音字母之前。这是一个字符集问题。更多讨论如下:
要存储的字节不编码为utf8。修好这个。
另外,检查读取期间的连接是否为utf8。
如果不知道您是否在使用php、java、python等,我就不能说得更具体了。不过,这里可能有一些提示。
同时,也许你不需要 id 总之,这4个索引可以简化为两个:

PRIMARY KEY(`name`,`value`),
KEY `tags_value_index` (`value`)

相关问题