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

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

我有以下向 Python 网页提供数据的 MySQL 查询。在网页上,我有一个歌曲标题列表,我希望它按字母顺序排列,忽略标点符号和空格。我的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, '')...

最佳答案

MySQL string literals不要为多字节字符提供转义序列。这一直是a feature request超过 7 年,仍在等待分类:我不会屏住呼吸,它会很快得到解决。

您必须将实际字符放入您的字符串字面量中,或者以您想要的编码知道它的组成字节(在这种情况下您可以使用类似 CHAR() 的东西)。

关于mysql - 在 MySQL 查询中使用 ORDER BY 时如何忽略特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394812/

相关文章:

javascript - jquery .replace(/./g, "") 对我不起作用,但对其他人不起作用

php - 在执行任何更新查询后,如何才能将旧值恢复到表中?

mysql - 如何更改 MySql for PostgreSQL 中的触发器?

php - array_multisort - 不对我的完整表格进行排序

Go 查询 (db2) 不提供表中的所有字符 (utf-8)

php - UTF-8贯穿始终

Java错误?为什么在 utf8 编码中额外的零字节?

mysql查询和子查询返回所有行

javascript - 查找页面上的每个 "string"并将其替换为另一个

c++ - C 风格的字符串查找和替换函数