如何在MySQL查询中使用ORDER BY时忽略特殊字符

时间:2012-05-01 07:28:50

标签: mysql utf-8 replace sql-order-by special-characters

我有以下MySQL查询,它为Python网页提供数据。在网页上,我有一个歌曲标题列表,我希望它按字母顺序排列,忽略标点符号和空格。我的MySQL数据库是UTF-8编码的,需要忽略的一些标点符号是特殊字符,如撇号等。

SELECT * FROM Tracks\
JOIN Artists USING (ArtistID)\
JOIN Albums USING (AlbumID)\
JOIN Songs USING (SongID)\
ORDER BY UPPER(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(\
REPLACE(SoName, ' ', ''), /* space */\
                        ',', ''), /* comma */\
                        '.', ''), /* period */\
                        ':', ''), /* colon */\
                        ';', ''), /* semicolon */\
                        '!', ''), /* exclamation point */\
                        '?', ''), /* question mark */\
                   '\u201c', ''), /* left curly double quote */\
                   '\u201d', ''), /* right curly double quote */\
                   '\u2019', ''), /* right curly single quote (apostrophe) */\
                   '\u2013', ''), /* n-dash */\
                   '\u2014', ''), /* m-dash */\
                   '\u2026', '') /* ellipsis */), (SongID), UPPER(AlTitle)

我的查询中的REPLACE似乎非常适合非特殊字符,例如空格,逗号,句号等,但它似乎跳过了特殊字符。

我的猜测是角色需要以不同的格式编写。我尝试了以下但没有成功: REPLACE(SoName, '\u2026', '') REPLACE(SoName, u'\2026', '') REPLACE(SoName, 0xE280A6, '') ...

2 个答案:

答案 0 :(得分:2)

MySQL string literals不为多字节字符提供转义序列。这已经a feature request超过7年了,现在还在等待分流:我不会屏住呼吸,它会很快得到解决。

您必须将实际字符放在字符串文字中,或者以您想要的编码知道其组成字节(在这种情况下,您可以使用CHAR()之类的内容。)

答案 1 :(得分:0)

我的兄弟告诉我把它放在包含MySQL查询的Python页面的顶部:

from __future__ import unicode_literals

现在一切似乎都有用了!