与不同COLLATION的字符串比较

时间:2017-06-27 21:19:40

标签: php mysql sql compare collation

MYSQL数据库

数据库1 - 表格 - 表格1
id - int
标题 - utf8_general_ci
价值观 -
1,Bienvenue Chez lesCh’ 2,ABC
3,XYZ

数据库2 - 表格 - 表格2
id - int
title - utf8_unicode_ci
价值观 -
1,Bienvenue Chez les Ch'tis
2,ABC
3,QWE

我在上面的两个表中都有标题列表。我想列出不相同的标题。

我尝试了很多不同的东西,但没有运气。

如何比较这些标题?

SELECT database1.table1.title as title1,database2.table2.title as title2 
FROM database1.table1 JOIN database2.table2 ON (database1.table1.id =database2.table2)
WHERE database1.table1.title NOT LIKE database2.table2.title COLLATE utf8_general_ci

以上查询的结果:
Bienvenue Chez lesCh’,Bienvenue Chez les Ch'tis XYZ,QWE

但我只想在下面结果
XYZ,QWE

我想排除法语,我想将其视为相同的标题。

1 个答案:

答案 0 :(得分:0)

’的Mojibake。当以两种不同的方式存储相同的右单引号时出现问题。不是COLLATION问题。

首先,检查两个表以查看存储的内容:

SELECT HEX(title) FROM database1.table1 WHERE id = 1

你会发现的两个可能的案例是:

C  h          ...        t  i  s
43 68        E28099      74 69 73  -- correctly encoded with UTF-8
43 68 C3A2 E282AC E284A2 74 69 73  -- "double encoded"

(为了清楚起见,我在HEX中添加了间距。)

如果其中一个表是"双重编码",那么它在INSERTing期间搞砸了。字符串比较相等。

This Q&A进一步讨论事情。然后查看this以修复双重编码的文本。但请务必仅将其应用于损坏的数据。