1

mySQL データベースから値を並べ替えると、次の間違った並べ替え順序が表示されます。

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

A  
B  
C  
...  
Ä  
Ö

この並べ替えの問題に対して何ができますか? Ä は A の間または後にある必要があります。

MySQL サーバーのバージョン: UTF-8 をサポートする 5.0.51a

これはデータベースの照合に関係していることがわかりました (ドイツ語のリンクを参照してください: http://mysql-faq.sourceforge.net/tables3.html )。

setDBinitスクリプトは、 set toSET NAMES utf8およびforceCharsetset toでTYPO3 に埋め込まれUTF-8ます。したがって、UTF-8 データは ISO-8859-1 (Latin 1) で保存する必要があります。

列には typetextと collat​​ion がありますlatin1_swedish_ciSHOW 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 の後のアルファベットの最後の 3 文字です。それが気に入らない場合は、列の照合順序を変更して、別のものに変更してください。

alter table tt_news modify title text collate latin1_general_ci;

generalバリアントは、文字のすべてのアクセント付きバリエーションを別個のものと見なしますが、ソート時にそれらをグループ化します。たとえば、 のAZ前に来ÄAます。スウェーデン語以外の国家標準が必要な場合は、MySQL がすぐにサポートできるもののリストを次に示します。

データベースの列の照合順序を変更できない場合は、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 に答える