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

q3qa4bjr  于 2023-11-16  发布在  Mysql
关注(0)|答案(3)|浏览(139)

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

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, '').

up9lanfz

up9lanfz1#

MySQL string literals不提供多字节字符的转义序列。这已经是a feature request超过7年了,仍然在等待分类:我不会屏住呼吸,它将很快得到解决。
您必须将实际字符放入字符串字面量中,或者在所需编码中知道其组成字节(在这种情况下,您可以使用类似CHAR()的内容)。

baubqpgj

baubqpgj2#

我检查了它的工作与本地环境,但不与集群服务器。
第一个月

SELECT  `document_ref` , `title` 
   FROM `table_gpl13`  
  ORDER BY 
   REPLACE(title,'\u00e0','a'),    //à        
   REPLACE(title,'\u00e2','a'),    //â       
   REPLACE(title,'\u00e7','c'),    //ç             
   REPLACE(title,'\u00e8','e'),    //é            
   REPLACE(title,'\u00e9','e'),    //ê 
   REPLACE(title,'\u00fb','u')  ASC

字符串

u5rb5r59

u5rb5r593#

我哥哥告诉我把这个放在包含MySQL查询的Python页面的顶部:

from __future__ import unicode_literals

字符串
现在一切似乎都在工作!

相关问题