1

从 mySQL 数据库中对我的值进行排序时,我得到以下错误的排序顺序:

SELECT * FROM tt_news WHERE pid=19 AND deleted=0 AND hidden=0 order by title ASC

A  
B  
C  
...  
Ä  
Ö

我能做些什么来解决这个排序问题?Ä 应该在 A 之间或之后,依此类推。

MySQL 服务器版本:5.0.51a,支持 UTF-8

我发现这与数据库的整理有关(参见德语链接: http: //mysql-faq.sourceforge.net/tables3.html)。

该脚本嵌入到 TYPO3 中,setDBinit设置为SET NAMES utf8forceCharset设置为UTF-8。所以 UTF-8 数据应该存储在 ISO-8859-1 (Latin 1) 中。

该列具有类型text和排序规则latin1_swedish_ci。当我进入SHOW VARIABLES LIKE 'collation%'phpMyAdmin 我得到

collation_connection    utf8_general_ci
collation_database  latin1_swedish_ci
collation_server    latin1_swedish_ci

SHOW VARIABLES LIKE '%CHARACTER_SET%';在 phpMyAdmin 中给我

character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /usr/share/mysql/charsets/

尝试1:

我试图SET NAMES utf8;在我的脚本中使用,但这并没有改变什么。

尝试2:

我想在 PHP 中进行排序(根据这个 SOQ:How to sort an array of associative arrays by value of a given key in PHP?),但这并没有改变排序。

$title=array();
foreach ($result as $key => $row) {
    $title[$key]  = $row['title'];
}
array_multisort($title, SORT_ASC, $result);

尝试 3:

我使用了这个 mySQL 语句(取自http://blog.mixable.de/mysql-order-by-und-deutsche-umlaute/):

SELECT * FROM tt_news WHERE pid=19 AND deleted=0 AND hidden=0 order by title COLLATE latin1_swedish_ci;

排序没有变化。使用utf-8会导致错误(不允许排序规则)。

尝试4:

SELECT *, REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(REPLACE(title, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'), 'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's') AS sortiert FROM tt_news WHERE pid=19 AND deleted=0 AND hidden=0 ORDER BY sortiert

来源:http ://www.php-faq.de/q-mysql-umlaute-sortieren.html

适用于 phpMyAdmin 但不适用于我的脚本。我收到以下错误:Illegal mix of collations (latin1_swedish_ci,IMPLICIT), (utf8_general_ci,COERCIBLE), (utf8_general_ci,COERCIBLE) for operation 'replace'

我可以在不更改字符集或排序规则的情况下在 PHP 中进行正确排序吗?

4

4 回答 4

2

根据瑞典规则,您看到的顺序是正确的:Å、Ä 和 Ö 是字母表的最后三个字母,在 Z 之后。如果您不喜欢它,请更改列排序规则,以便其他内容。

alter table tt_news modify title text collate latin1_general_ci;

general变体将字符的所有重音变体视为不同,但在排序时将它们组合在一起;例如AZ来之前ÄA。如果您需要瑞典语以外的其他国家标准,这里列出了 MySQL 开箱即用的支持:http: //dev.mysql.com/doc/refman/5.6/en/charset-we-sets.html

如果您无法更改数据库中的列排序规则,您可以告诉 MySQL 使用特定排序规则来对查询进行排序。例如:

.... order by title collate latin1_general_ci
于 2013-07-12T10:57:21.240 回答
0

使用“按标题 latin1_german1_ci 排序”

Ä = A
Ö = O
Ü = U
ß = s

使用“按标题 latin1_german2_ci 排序”

Ä = AE
Ö = OE
Ü = UE
ß = ss

排序更多http://dev.mysql.com/doc/refman/5.6/en/charset-we-sets.html

于 2015-03-16T07:55:09.590 回答
0

纯PHP解决方案:

function sortWUmlauts($s1, $s2)
{
    $s1 = $s1['title'];
    $s2 = $s2['title'];
    $search = array('Ä','Ö','Ü','ß');
    $replace = array('A','O','U','s');

    return strcasecmp(
       str_ireplace($search, $replace, $s1),
       str_ireplace($search, $replace, $s2)
    );
}

// call
uasort($result, 'sortWUmlauts');

取自http://at2.php.net/manual/en/function.uasort.php#99017

一个很好的补充是有一个变量来保存关联数组的搜索键(直接将函数嵌入到 uasort 调用中)。

于 2013-07-12T11:22:46.510 回答
0

您不必修改您的数据库来执行此操作(当然,除非您愿意)。也许您有不同的列要根据不同的语言进行排序?

只需在查询中指定不同的排序规则,例如:

SELECT * FROM tt_news WHERE pid=19 ORDER BY title COLLATE "utf8_german2_ci" ASC

请注意,如果您的表尚未采用 utf8 排序规则(可能是 latin1 排序规则),那么您将需要使用 latin1 排序规则进行排序。在这种情况下,您将在上面的查询中使用latin1_german2_ci而不是。utf8_german2_ci

排序规则列表及其使用的有用讨论可在此处的 MySQL 参考文档中找到。

于 2018-03-23T19:06:38.573 回答