mysql - 在有问题的数据库上进行不区分重音的搜索

标签 mysql utf-8 character-encoding

我有一个包含不同语言数据的数据库。有些语言使用重音符号(如 áéíóú),我需要搜索此数据,因为重音符号不存在(搜索“campeon”应该返回“campeón”作为有效结果)。

问题是我的数据库 (utf8_unicode_ci) 中的表没有存储 utf8 字符。如果您通过 phpmyadmin 查看数据,带有重音符号的单词如下所示:campeón

经过一些研究,我发现(在 StackOverflow question 中)问题与 SET NAMES [charset] 的不存在有关。事实上,我已经进行了一些测试,如果我将名称设置为 utf8,一切都会按预期工作。

好吧,我有解决方案,问题是什么?问题是数据库正在生产中,因此数据库中有数千个字符串。如果我更改客户端将使用的字符集,所有已经存在的字符串都将变得无效。问题是:有没有办法:

  1. 在像我这样使用错误字符集的数据库中执行不区分重音的搜索?
  2. 将表中的数据安全地转换为适当的字符集?
  3. 继续在数据库中使用混合字符集(latin1 和 utf8),假设 latin1 数据不会区分重音?

如果有人对我提出的任何解决方案有经验或有新的解决方案,我将不胜感激。

最佳答案

问题是数据是使用错误的连接编码插入的,您可以通过以下方式修复它

  1. 使用错误的连接编码导出数据,就像您到目前为止使用的一样,然后是
  2. 使用正确的 utf8 连接编码导入数据。

这将解决编码问题,之后搜索将按预期工作。

关于mysql - 在有问题的数据库上进行不区分重音的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9699473/

相关文章:

php - 无法在 mySQL 列中保存今天的日期

mysql - 为mysql数据库生成html或excel或pdf文档

c - 从指针到 char 返回正确的变音字符?

python - TypeError : string argument without an encoding in 3. 4 但在 3.6 中没有

php - 将项目从 windows-1256 转换为 utf-8 字符集,正确的步骤是什么?

c++ - Protocol Buffers 字符串字段的文本编码

php - 如果数据为空,如何在查询中使用计数来计算 0

php - 如何选择不同的子字符串字段或删除重复字段

oracle - SQL 错误 : ORA-12712: new character set must be a superset of old character set

java - 如何在java中将Unicode(utf-8)转换为十六进制字符串?