首先让我告诉你我正在使用的字符集和排序规则是utf8_general_ci。
为了举例,我有两个表,A和B.
表A有一列(我们称之为'columnX')。在表格的任何一行中,columnX可能包含一个包含拉丁字符的值,例如'niño'(英文中的'boy')。
表B有一个专栏(让我们称之为'columnY'),我知道这可能包含'niño'作为其价值的一部分,例如'esunniñobueno'('他是一个英语中的好男孩'),但是'ñ'将被转义,因为我知道columnY包含JSON字符串,因此字符串文字将被编码为'es un ni \ u00f1o bueno'。
我需要找到表A的所有行,其列A.columnX包含在任何B.columnY中。我需要一个在其相应的转义版本中转换al A.columnX的函数。以下代码的内容:
SELECT * FROM A
INNER JOIN B
ON B.columnY LIKE CONCAT('%', escapeUtf8(A.columnX) ,'%')
我尝试过使用QUOTE
,CONVERT
,CAST
以及谷歌搜索了很多,但我发现的所有内容都与我需要的相反(帖子解释了如何转换)将序列转义为人类可读的东西。)
提前致谢,
Adrián
答案 0 :(得分:0)
您应该将ñ
作为十六进制C3B1
存储在utf8列中。执行SELECT HEX(col) ...
检查。如果它是&...;
(有大约3种可能的方式来表示“html实体”),那么你应该在INSERTing
文本时解决这个问题。
escapeUtf8()
只会使情况复杂化;那里不需要任何功能。
答案 1 :(得分:0)
我找到了解决方法
我所做的是使用我在这里找到的STRINGDECODE函数(看看Joni的答案):MySQL decode Unicode to UTF-8 function我用它来“反转”查询。
我没有从表A中用“ñ”(或重音字母等)转义列,而是使用STRINGDECODE转义表B中的转义列。
此外,由于我需要多次使用已解码的列值,因此我将B.columnY存储在临时表中(当然,在应用STRINGDECODE之后)以供以后使用。这将是示例代码:
CREATE TEMPORARY TABLE sanitizedB
SELECT STRINGDECODE(columnY) as sanitizedColumnY, columnZ
FROM B;
SELECT * FROM A
INNER JOIN sanitizedB SB
ON SB.sanitizedColumnY LIKE CONCAT('%', A.columnX ,'%')
当然,我还添加了其他我需要的列供以后使用。
值得一提的是,B表的记录少于10,000条,因此临时表的创建速度非常快......可能不是最佳解决方案,但对我来说效果很好。