Yasadışı harmanlama karışımı MySQL Hatası


124

Çok sayıda veriyi işlerken bu garip hatayı alıyorum ...

Error Number: 1267

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

Bunu çözmek için ne yapabilirim? Bu hatanın oluşmaması için dizeden bir şekilde kaçabilir miyim, yoksa tablo kodlamamı bir şekilde değiştirmem gerekir mi ve eğer öyleyse neye değiştirmeliyim?


bu hata, enjekte edilebilir mi değil mi?
hamza irizaj

Yanıtlar:


288
SET collation_connection = 'utf8_general_ci';

sonra veritabanlarınız için

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

MySQL bazen mantıklı bir sebep olmadan oraya İsveççe sızar.


3
@Ben: Doğrudan kopyalanabilir bir çözüm için teşekkür ederiz. Bana çok zaman kazandırdı.
Pistos

15
@Ben: Başlangıçta bir İsveç şirketi tarafından geliştirildi ... Can sıkıcı latin1_swedish_ci ilk ayarının arkasındaki neden budur .. :(
Vajk Hermecz

1
İlk ifadeyi yapma
Rob Sedgwick

Bunun için seni seviyorum! : P
prateekkathal

Bu pek çok insan için işe yarıyor gibi görünüyor, ancak maalesef bu konudaki tüm cihazı denedikten sonra bile hala bu sorunu yaşıyorum. Veritabanımın varsayılan harmanlaması inatla 'ucs2_bin'den değiştirmeyi reddediyor, bu yüzden tüm tabloları ve bağlantı harmanlamasını' usc2_bin 'olarak değiştirmeyi denedim, ancak yine de "SQL Hatası (1267): Yasadışı harmanlama karışımı (utf8_general_ci, IMPLICIT) ve (ucs2_bin, IMPLICIT) '=' "işlemi için.
bikeman868

15

Hem tablo kodlamanızı hem de bağlantı kodlamanızı şu şekilde ayarlamalısınız UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

ve

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

Bunların her ikisine de ihtiyaç var mı yoksa sadece birini yapabilir miyim?
Olumlu oy'u tıklayın.

ALTER VERİTABANI myDbVARSAYILAN KARAKTER SETİ utf8 COLLATE utf8_bin. Işe yarar mı? Bu, yalnızca bir tanesini değil tüm masalarımı etkileyecek şekilde yapıldı
32'de Yukarı Oy Ver'e tıklayın

1
ALTER DATABASE mevcut tablo ayarlarınızı değiştirmez, sadece yeni oluşturulanları değiştirir. Yine de veritabanı için varsayılan karakter setini değiştirmek zarar vermez.
Quassnoi

SET NAMES ve SET CHARACTER SET bağlantı kodlamanızı değiştirecektir. Her bağlandığınızda bu komutları vermeniz gerekir. İstemci kitaplığınız bunu yapmak için daha zarif bir yöntemi destekleyebilir (php :: mysqli yapar, php :: mysql desteklemez).
Quassnoi

Şimdilik işe yarıyor gibi görünüyor, biraz daha test yaptıktan sonra kabul edeceğim. İkinci sorguların bir kez mi yoksa her betiğin başında mı çalıştırılması gerekiyor?
Haz09

13
CONVERT(column1 USING utf8)

Sorunumu çözer. Sütun1 bana bu hatayı veren sütundur.


Benim için bu işe yaradı: CONVERT ("column1"
LATIN1

4

Hata için aşağıdaki ifadeyi kullanın

Verileriniz konusunda dikkatli olun, veriler tabloda varsa yedek alın.

 TABLO sizin_tablo_adı KARAKTER SETİNE DÖNÜŞTÜRME utf8 COLLATE utf8_general_ci;

2

Genel olarak en iyi yol, tablo harmanlamasını değiştirmektir. Ancak eski bir uygulamam var ve bunun yan etkileri olup olmadığını gerçekten tahmin edemiyorum. Bu nedenle, dizeyi bir şekilde harmanlama sorununu çözen başka bir biçime dönüştürmeyi denedim. Çalışırken bulduğum şey, dizeleri karakterlerinin onaltılık bir temsiline dönüştürerek dizeyi karşılaştırmaktır. Veritabanında bu HEX(column).PHP için yapılır, şu işlevi kullanabilirsiniz:

public static function strToHex($string)
{
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

Veritabanı sorgusu yaparken, orijinal UTF8 dizginiz DB'de kullanılmadan önce bir iso dizgesine (örneğin utf8_decode()PHP'de kullanılarak) dönüştürülmelidir . Harmanlama türü nedeniyle, veritabanının içinde UTF8 karakterleri olamaz, bu nedenle orijinal dizeyi değiştirse de karşılaştırma olayı çalışmalıdır (ISO karakter kümesinde bulunmayan UTF8 karakterlerinin dönüştürülmesi bir? İle sonuçlanır veya bunlar tamamen kaldırılır). Veritabanına veri yazarken aynı UTF8 - ISO dönüşümünü kullandığınızdan emin olun.


2

Masam orijinal olarak CHARSET = latin1 ile oluşturuldu . Utf8'e tablo dönüştürüldükten sonra bazı sütunlar dönüştürülmedi, ancak bu gerçekten açık değildi. Çalıştırmayı deneyebilir SHOW CREATE TABLE my_table;ve hangi sütunun dönüştürülmediğini görebilir veya aşağıdaki sorgu ile sorunlu sütundaki yanlış karakter kümesini düzeltebilirsiniz (ihtiyaçlarınıza göre varchar uzunluğunu ve CHARSET ve COLLATE değiştirin):

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;

2

Tablonun karakter kümesini utf8 olarak değiştirin

TABLO tablo_adı KARAKTER SETİNE DÖNÜŞTÜRME TABLOSU utf8


0

En üstteki yanıtta listelenen düzeltmelerinizi yaptıktan sonra, sunucunuzun varsayılan ayarlarını değiştirin.

" /Etc/my.cnf.d/server.cnf " dosyanızda veya bulunduğu her yerde varsayılanları [mysqld] bölümüne ekleyin, böylece şöyle görünür:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Kaynak: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


0

Kullanmanın cast()benim için en iyi çözüm olduğunu buldum:

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount

Bir convert()işlevi de var. Bununla ilgili daha fazla ayrıntı burada

Burada başka bir kaynak


0

Bu çözümde önerildiği gibi, kullanıcı hesabım veritabanını ve tabloyu değiştirme iznine sahip değildi .

Benim gibi, karakter harmanlamasını önemsemiyorsanız ('=' operatörünü kullanıyorsunuz), ters düzeltmeyi uygulayabilirsiniz. Bunu SELECT'inizden önce çalıştırın:

SET collation_connection = 'latin1_swedish_ci';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.