从 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 utf8
并forceCharset
设置为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 中进行正确排序吗?