2

理解できません。私は本当にそれを手に入れたことはありませんでしたが、今は本当に迷っています。データベースは utf8、テーブルは utf8、列は utf8 です。一部のデータは latin1/iso-8859-1 であるため、正しく表示されません。(今は気にしません。) 以前はすべて latin1 でしたが、現在は 50/50 で、さらに悪化しています。

すべての utf8 を使用するように接続に具体的に指示しない場合、すべてのクエリが機能し、すべてのデータが正しく表示されます (間違って保存されている場合でも)。これは、ストレージが間違っており (utf8 の latin1)、接続が「間違っている」 (デフォルトの latin1 だと思います) ため、互いに相殺されます。文字はOKでエラーはありません。しかし、データベースにはがらくたが含まれているため、明らかに受け入れられません。

だから私はすべてutf8が欲しいので、MySQLに具体的に伝えます(毎回最初のクエリ):

SET NAMES 'utf8' COLLATE 'utf8_general_ci'

そして、どういうわけか、次のクエリは失敗します。

SELECT
  r.id,
  r.slots,
  r.start_time AS StartA,
  ADDTIME(r.start_time, SEC_TO_TIME(60*r.slots*s.slotsize)) AS EindA,
  '14:30:00' AS StartB,
  '15:30:00' AS EindB
FROM
  club_sports s, resources c, reservations r
WHERE
  r.resource_id = c.id AND
  c.club_sport_id = s.id AND
  r.not_cancelled = '1' AND
  r.resource_id = 25 AND
  r.date = '2013-01-18'
HAVING
  (
    (StartA >= StartB AND StartA < EindB) OR
    (EindA >= StartB AND EindA < StartB) OR
    (StartB >= StartA AND StartB < EindA) OR
    (EindB >= StartA AND EindB < StartA)
  )
LIMIT 1

次のエラーで:

操作 '<' の照合 (utf8_general_ci,COERCIBLE) と (latin1_swedish_ci,NUMERIC) の不正な組み合わせ

理解できません!どこで入手できますlatin1_swedish_ci,NUMERICか?? HAVING のすべての部分は数値ではなく、すべて同じ utf8 ですよね? ソース テーブルと列は utf8 です。

クエリが完全ではないことはわかっていますが、それは今のところ関係ありません。''HAVINGでfake/tmp列を作成して比較できるはずですよね?

json_encode には本当に utf8 が必要なので、データを utf8 にする必要があるため、データベースを utf8 にする必要があるため、接続を utf8 にする必要があります。ヘルプ!

4

1 に答える 1

0

HAVING 句は集計値用です (GROUP BY 項目の WHERE 句を考えてください)。

エイリアスを使用できないため、WHERE 句で (ADDTIME 関数のように) 計算をやり直す必要があります。

于 2013-01-18T20:54:50.937 に答える