PHP ile MySQL için kullanılacak en iyi harmanlama nedir? [kapalı]


731

Ne girileceğini% 100 emin değilseniz genel bir web sitesi için MySQL harmanlama için "en iyi" bir seçim olup olmadığını merak ediyorum? MySQL, Apache, HTML ve PHP içindeki herhangi bir şey gibi tüm kodlamaların aynı olması gerektiğini anlıyorum.

Geçmişte PHP'yi "UTF-8" biçiminde çıktı olarak ayarladım, ancak bu MySQL'de hangi harmanlama ile eşleşiyor? Ben UTF-8 olanlardan biri düşünüyorum, ama ben kullandım utf8_unicode_ci, utf8_general_cive utf8_bindaha önce.


35
Yan not: MySQL "utf8" doğru UTF-8 (𝌆 gibi 4+ bayt Unicode karakterler için destek yok), ancak "utf8mb4" olduğunu. Utf8 ile, desteklenmeyen ilk Unicode karakteri ile başlayarak kesici uçta bir alan kesilir. mathiasbynens.be/notes/mysql-utf8mb4
basic6

6
Tüm bu emojiler için 5 bayta ihtiyacımız olup olmayacağını merak ediyorum ...
Álvaro González

1
İlgili soru: stackoverflow.com/questions/38228335/… "Hangi MySQL harmanlaması PHP'nin dize karşılaştırmasıyla tam olarak eşleşiyor?"
William Entriken

Aklı başında seçeneklere genel bir bakış için: monolune.com/mysql-utf8-charsets-and-collations-explained
Flux

Yanıtlar:


618

Temel fark sıralama doğruluğu (dildeki karakterleri karşılaştırırken) ve performanstır. Tek özel olan, karakterleri ikili biçimde karşılaştırmak için utf8_bin'dir.

utf8_general_ciutf8_unicode_ci(sıralama için) biraz daha hızlı , ancak daha az doğrudur. Belirli bir dil utf8 kodlama (gibi utf8_swedish_ci) onları en doğru diller için, sıralamak yapmak ek dil kurallarını içermektedir. utf8_unicode_ciBelirli bir dili tercih etmek için iyi bir nedenim olmadıkça çoğu zaman (küçük performans iyileştirmelerinde doğruluğu tercih ederim) kullanırım .

MySQL kılavuzunda belirli unicode karakter kümeleri hakkında daha fazla bilgi edinebilirsiniz - http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html


4
küçük performans iyileştirmeleri? bundan emin misin ? publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/… Seçtiğiniz harmanlama, sorguların veritabanındaki performansını önemli ölçüde etkileyebilir.
Adam Ramadhan

62
Bu DB2 için MySQL değil. Ayrıca, somut sayılar veya kriterler yoktur, bu yüzden sadece yazarın görüşüne dayandırırsınız.
Eran Galperin

3
İşlevleri kullanmak istiyorsanız, MySQL'de (şu anda dağıtılmış sürümler), işlevlerin her zaman dizeyi utf8_general_ci kullanarak döndürdüğü ve dizeleriniz için başka bir harmanlama kullanıyorsanız sorunlara neden olduğu bir hata olduğunu unutmayın - bugs.mysql.com/ bug.php? id = 24690
El Yobo

1
Farklı yerel utf8_unicode_*
ayarlarla yaşadığım deneyimden

11
Güncelleme: Daha yeni sürümler için tavsiye edin utf8mb4ve utf8mb4_unicode_520_ci. Bunlar size Çince'nin geri kalanını ve ayrıca daha iyi bir harmanlama sağlar.
Rick James

129

Aslında, muhtemelen utf8_unicode_civeya kullanmak istersiniz utf8_general_ci.

  • utf8_general_ci tüm aksanları sıyrılarak ve sanki ASCII gibi sıralayarak
  • utf8_unicode_ci Unicode sıralama düzenini kullanır, bu nedenle daha fazla dilde doğru şekilde sıralanır

Ancak, bunu yalnızca İngilizce metin saklamak için kullanıyorsanız, bunlar farklı olmamalıdır.


1
Açıklamanızı seviyorum! İyi bir. Ama neden unicode sıralama düzeninin aksanları sıyırmaktan daha doğru bir şekilde sıralamanın daha iyi bir yol olduğunu daha iyi anlamaya ihtiyacım var.
weia tasarımı

14
@Adam Gerçekten hedef kitlenize bağlıdır. Sıralama, doğru bir şekilde yerelleştirilmesi zor bir sorundur. Norveççe'de Æ Ø Å harfleri alfabenin son 3 harfidir. Utf8_general_ci ile, Ø ve Å, sıralandıklarında onları tamamen yanlış pozisyona sokan O ve A'ya dönüştürülür (Æ, bir ligatür, aksanlı bir karakter değil, nasıl ele alınacağından emin değilim). Bu sıralama düzeni hemen hemen her dilde farklıdır, örneğin Norveççe ve İsveççe farklı sıralara sahiptir (ve eşit kabul edilen biraz farklı harfler): Æ Ø Å sıralanır Å Æ Ø (gerçek harfler Å Ä Ö'dir). Unicode bunu düzeltir.
Vegard Larsen

Demek istediğim, eğer yapabiliyorsanız muhtemelen dile özgü bir sıralama kullanmalısınız, ancak çoğu durumda bu mümkün değildir, bu yüzden Unicode genel sıralama için gidin. Bazı dillerde hala garip olacak, ancak ASCII'den daha doğru olacak.
Vegard Larsen

3
@Manatax - utf8_ harmanlamalarından herhangi biriyle, veriler utf8 olarak saklanır. Harmanlama, hangi karakterlerin eşit kabul edildiği ve nasıl sıralandıklarıyla ilgilidir.
frymaster

2
@frymaster - doğru değil, şu şekildedir : mathiasbynens.be/notes/mysql-utf8mb4 "MySQL'in utf8'i tüm olası Unicode kod noktalarının yalnızca% 5.88'ini saklamanıza izin veriyor"
veri

120

Kullanırken ortaya çıkabilecek bu sorunun çok, çok farkında olun utf8_general_ci.

utf8_general_ciHarmanlama kullanılıyorsa , MySQL, select deyimlerindeki bazı karakterleri ayırt etmez . Bu çok kötü hatalara neden olabilir - özellikle kullanıcı adlarının söz konusu olduğu yerlerde. Veritabanı tablolarını kullanan uygulamaya bağlı olarak, bu sorun kötü niyetli kullanıcıların bir yönetici hesabıyla eşleşen bir kullanıcı adı oluşturmasına izin verebilir.

Bu sorun en azından 5.x sürümlerinde kendini ortaya çıkarır - Bu davranışın daha sonra değiştiğinden emin değilim.

Ben DBA değilim, ama bu sorunu önlemek için, her zaman büyük utf8-bin/ küçük harfe duyarsız bir sorun yerine giderim .

Aşağıdaki komut dosyası sorunu örnek olarak açıklamaktadır.

-- first, create a sandbox to play in
CREATE DATABASE `sandbox`;
use `sandbox`;

-- next, make sure that your client connection is of the same 
-- character/collate type as the one we're going to test next:
charset utf8 collate utf8_general_ci

-- now, create the table and fill it with values
CREATE TABLE `test` (`key` VARCHAR(16), `value` VARCHAR(16) )
    CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `test` VALUES ('Key ONE', 'value'), ('Key TWO', 'valúe');

-- (verify)
SELECT * FROM `test`;

-- now, expose the problem/bug:
SELECT * FROM test WHERE `value` = 'value';

--
-- Note that we get BOTH keys here! MySQLs UTF8 collates that are 
-- case insensitive (ending with _ci) do not distinguish between 
-- both values!
--
-- collate 'utf8_bin' doesn't have this problem, as I'll show next:
--

-- first, reset the client connection charset/collate type
charset utf8 collate utf8_bin

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Note that we get just one key now, as you'd expect.
--
-- This problem appears to be specific to utf8. Next, I'll try to 
-- do the same with the 'latin1' charset:
--

-- first, reset the client connection charset/collate type
charset latin1 collate latin1_general_ci

-- next, convert the values that we've previously inserted
-- in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET latin1 COLLATE latin1_general_ci;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Again, only one key is returned (expected). This shows 
-- that the problem with utf8/utf8_generic_ci isn't present 
-- in latin1/latin1_general_ci
--
-- To complete the example, I'll check with the binary collate
-- of latin1 as well:

-- first, reset the client connection charset/collate type
charset latin1 collate latin1_bin

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Again, only one key is returned (expected).
--
-- Finally, I'll re-introduce the problem in the exact same 
-- way (for any sceptics out there):

-- first, reset the client connection charset/collate type
charset utf8 collate utf8_generic_ci

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

-- now, re-check for the problem/bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Two keys.
--

DROP DATABASE sandbox;

36
-1: Bu kesinlikle ilgili sütuna benzersiz bir anahtar uygulanarak giderilir. İki değer 'value've olsaydı aynı davranışı görürsünüz 'valUe'. Bir harmanlamanın tüm amacı, iki dizenin birbirine eşit olduğu kabul edildiğinde (diğer şeylerin yanı sıra) kurallar sağlamasıdır.
Hammerite

13
Bu tam olarak göstermeye çalıştığım problem - harmanlama iki şeyi eşit hale getirirken, aslında hiç de eşit olma niyetinde değiller (ve bu nedenle, benzersiz bir kısıtlama elde etmek istediğiniz şeyin tam tersidir)
Guus

18
Ancak bunu bir "sorun" olarak tanımlıyorsunuz ve davranış tam olarak bir harmanlamanın gerçekleştirmeyi amaçladığı zaman "hatalara" yol açıyorsunuz. Açıklamanız doğru, ancak yalnızca DBA'nın uygun olmayan bir harmanlama seçmek için bir hata olduğu ölçüde.
Hammerite

32
Mesele şu ki, harmanlama ile eşit kabul edilen iki kullanıcı adı girdiğinizde, coloumn kullanıcı adını benzersiz olacak şekilde ayarlamanıza izin verilmeyecektir, ki bunu yapmanız gerekir!
Öğrenci Hogwarts

12
Hem bu cevabı hem de @ Hammerite'nin yorumunu onayladım, çünkü ikisi de bir araya getirme anlayışına ulaşmama yardımcı oldu.
Nacht - Monica

86

Karakter kümesini utf8mb4harmanlama ile kullanmak en iyisidir utf8mb4_unicode_ci.

Karakter seti, utf8sadece az miktarda UTF-8 kod noktasını, olası karakterlerin yaklaşık% 6'sını destekler. utf8sadece Temel Çok Dilli Düzlemi (BMP) destekler. 16 uçak daha var. Her uçak 65.536 karakter içeriyor. utf8mb417 uçağın hepsini destekler.

MySQL, 4 bayt UTF-8 karakterlerini keserek verilerin bozulmasına neden olur.

utf8mb4Karakter kümesi 2010-03-24 tarihinde MySQL 5.5.3 tanıtıldı.

Yeni karakter setini kullanmak için gerekli değişikliklerden bazıları önemsiz değildir:

  • Uygulama veritabanı bağdaştırıcınızda değişiklik yapılması gerekebilir.
  • Karakter kümesinin ayarlanması, harmanlama ve innodb_file_format öğesinin Barracuda olarak değiştirilmesi de dahil olmak üzere my.cnf dosyasında değişiklikler yapılması gerekecektir.
  • SQL CREATE deyimlerinin şunları içermesi gerekebilir: ROW_FORMAT=DYNAMIC
    • DİNAMİK, VARCHAR (192) ve daha büyük dizinler için gereklidir.

NOT: geçiş Barracudadan Antelopekereden fazla MySQL hizmetini yeniden başlatmayı gerektirebilir. innodb_file_format_max: MySQL servisi için çalıştıktan sonra dek değişmez innodb_file_format = barracuda.

MySQL eski AntelopeInnoDB dosya biçimini kullanır . Barracudakarakter kümesine geçtikten sonra dizinler ve anahtarlar oluşturmak için SQL hatalarına çarpmak istemiyorsanız ihtiyaç duyacağınız dinamik satır biçimlerini destekler:utf8mb4

  • # 1709 - Dizin sütunu boyutu çok büyük. Maksimum sütun boyutu 767 bayttır.
  • # 1071 - Belirtilen anahtar çok uzundu; maksimum anahtar uzunluğu 767 bayttır

Aşağıdaki senaryo MySQL 5.6.17 üzerinde test edilmiştir: Varsayılan olarak, MySQL şu şekilde yapılandırılmıştır:

SHOW VARIABLES;

innodb_large_prefix = OFF
innodb_file_format = Antelope

MySQL hizmetinizi durdurun ve mevcut my.cnf'nize seçenekleri ekleyin:

[client]
default-character-set= utf8mb4

[mysqld]
explicit_defaults_for_timestamp = true
innodb_large_prefix = true
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_per_table = true

# Character collation
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci

Örnek SQL CREATE ifadesi:

CREATE TABLE Contacts (
 id INT AUTO_INCREMENT NOT NULL,
 ownerId INT DEFAULT NULL,
 created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 contact VARCHAR(640) NOT NULL,
 prefix VARCHAR(128) NOT NULL,
 first VARCHAR(128) NOT NULL,
 middle VARCHAR(128) NOT NULL,
 last VARCHAR(128) NOT NULL,
 suffix VARCHAR(128) NOT NULL,
 notes MEDIUMTEXT NOT NULL,
 INDEX IDX_CA367725E05EFD25 (ownerId),
 INDEX created (created),
 INDEX modified_idx (modified),
 INDEX contact_idx (contact),
 PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT=DYNAMIC;
  • Sen için oluşturulan hata # 1709 görebilirsiniz INDEX contact_idx (contact)eğer ROW_FORMAT=DYNAMICCREATE deyimi kaldırılır.

NOT: Dizinin ilk 128 karakterle sınırlandırılması, contactBarracuda ile birlikte kullanılması gereksinimini ortadan kaldırırROW_FORMAT=DYNAMIC

INDEX contact_idx (contact(128)),

Ayrıca not: alanın boyutu söylendiğinde VARCHAR(128), bu 128 bayt değildir. 128, 4 bayt karakter veya 128, 1 bayt karakter kullanabilirsiniz.

Bu INSERTifade, 2 satırda 4 baytlık 'poo' karakterini içermelidir:

INSERT INTO `Contacts` (`id`, `ownerId`, `created`, `modified`, `contact`, `prefix`, `first`, `middle`, `last`, `suffix`, `notes`) VALUES
(1, NULL, '0000-00-00 00:00:00', '2014-08-25 03:00:36', '1234567890', '12345678901234567890', '1234567890123456789012345678901234567890', '1234567890123456789012345678901234567890', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678', '', ''),
(2, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '', ''),
(3, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '123💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '', '');

lastSütun tarafından kullanılan alan miktarını görebilirsiniz :

mysql> SELECT BIT_LENGTH(`last`), CHAR_LENGTH(`last`) FROM `Contacts`;
+--------------------+---------------------+
| BIT_LENGTH(`last`) | CHAR_LENGTH(`last`) |
+--------------------+---------------------+
|               1024 |                 128 | -- All characters are ASCII
|               4096 |                 128 | -- All characters are 4 bytes
|               4024 |                 128 | -- 3 characters are ASCII, 125 are 4 bytes
+--------------------+---------------------+

Veritabanı bağdaştırıcınızda, bağlantınız için karakter kümesini ve harmanlamayı ayarlamak isteyebilirsiniz:

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'

PHP'de bu, aşağıdakiler için ayarlanır: \PDO::MYSQL_ATTR_INIT_COMMAND

Referanslar:




6
utf8mb4_unicode_ci 2015 yılında yeni projeler için kesinlikle tavsiye edilen harmanlama olmalıdır.
Trevor Gehman

7
Güncelleme ... utf8mb4_unicode_520_cidaha iyi. Gelecekte, utf8mb4_unicode_800_ciMySQL Unicode standartlarını yakaladığı için (veya bunun gibi bir şey) olacaktır .
Rick James

46

Harmanlamalar verilerin nasıl sıralanacağını ve dizelerin birbiriyle nasıl karşılaştırıldığını etkiler. Bu, kullanıcılarınızın çoğunun beklediği harmanlamayı kullanmanız gerektiği anlamına gelir.

Charset unicode belgelerinden bir örnek :

utf8_general_ciAlmanca ve Fransızca dillerinde de tatmin edicidir, ancak 'ß', 's' değerine eşittir, 'ss' değerine eşit değildir. Bu, uygulamanız için kabul edilebilir durumdaysa, daha utf8_general_cihızlı olduğu için kullanmalısınız . Aksi takdirde, utf8_unicode_cidaha doğru olduğu için kullanın .

Yani - beklenen kullanıcı tabanınıza ve ne kadar doğru sıralamaya ihtiyacınız olduğuna bağlıdır . İngilizce bir kullanıcı tabanı utf8_general_ciiçin, İsveççe gibi diğer diller için özel harmanlamalar oluşturulmuştur.


1
i utf8_general_ci kullanarak ve sıralama ederken ikinci bir çift aldı ve armscii_general_ci son derece quick.Why bu Bir daha sosyal ağ siteleri tarafından kullanılan harmanlama sizce ne Question oldu, yaptık oldu?

22

Esasen, bir ipi nasıl düşündüğünüze bağlıdır.

Guus tarafından vurgulanan sorun nedeniyle her zaman utf8_bin kullanıyorum. Bence, veritabanı söz konusu olduğunda, bir dize hala sadece bir dizedir. Dize, bir dizi UTF-8 karakteridir. Bir karakterin ikili temsili vardır, bu yüzden neden kullandığınız dili bilmesi gerekir? Genellikle, insanlar çok dilli siteler kapsamındaki sistemler için veritabanları inşa edeceklerdir. UTF-8'i karakter kümesi olarak kullanmanın tüm noktası budur. Biraz safkanım ama sanırım böcek riskleri, endekslemede elde edebileceğiniz hafif avantajdan ağır basar. Dille ilgili tüm kurallar DBMS'den çok daha yüksek bir düzeyde yapılmalıdır.

Kitaplarımda “değer” asla bir milyon yıl içinde “valúe” ye eşit olmamalı.

Bir metin alanı depolamak ve büyük / küçük harf duyarsız bir arama yapmak istiyorsanız, LOWER () ve php işlevi strtolower () gibi PHP işlevleriyle MYSQL dize işlevlerini kullanacağım.


9
Dizelerin ikili karşılaştırması istediğiniz karşılaştırma ise, elbette ikili harmanlamayı kullanmalısınız; ancak alternatif harmanlamaları "hata riski" olarak reddetmek veya yalnızca dizine eklemenin kolay olması açısından bir harmanlama noktasını tam olarak anlamadığınız anlamına gelir.
Hammerite

13

UTF-8 metin bilgileri için şunu kullanmalısınız utf8_general_ciçünkü ...

  • utf8_bin: dizeleri dizgideki her karakterin ikili değeri ile karşılaştırır

  • utf8_general_ci: Genel dil kurallarını kullanarak ve büyük / küçük harfe duyarlı olmayan karşılaştırmaları kullanarak dizeleri karşılaştır

aka veri arama ve indeksleme daha hızlı / daha verimli / daha yararlı hale getirecektir.


12

Kabul edilen cevap oldukça kesin bir şekilde utf8_unicode_ci kullanmayı önermektedir ve harika olan yeni projeler için, kimseye biraz zaman kazandırması durumunda son ters deneyimimi anlatmak istedim.

Utf8_general_ci MySQL'de Unicode için varsayılan harmanlama olduğundan, utf8_unicode_ci kullanmak istiyorsanız, bunu birçok yerde belirtmeniz gerekir .

Örneğin, tüm istemci bağlantılarında yalnızca varsayılan bir karakter kümesi (benim için anlamlıdır) değil, aynı zamanda varsayılan bir harmanlama bulunur (yani, harmanlama her zaman unicode için utf8_general_ci olarak varsayılan olur).

Muhtemelen, alanlarınız için utf8_unicode_ci kullanırsanız, veritabanına bağlanan komut dosyalarınızın istenen harmanlamadan açıkça bahsetmek üzere güncellenmesi gerekir - aksi takdirde bağlantınız varsayılan harmanlamayı kullanırken metin dizelerini kullanan sorgular başarısız olabilir.

Sonuç olarak, herhangi bir boyuttaki mevcut bir sistemi Unicode / utf8'e dönüştürürken, MySQL'in varsayılanları işleme biçimi nedeniyle utf8_general_ci kullanmaya zorlanabilirsiniz.


8

Guus tarafından vurgulanan dava için, utf8_bin (katı eşleme, yanlış sipariş) yerine utf8_unicode_cs (büyük / küçük harfe duyarlı, katı eşleme, çoğunlukla doğru sipariş verme) kullanmanızı şiddetle öneririm.

Alanın bir kullanıcıyla eşleşmenin aksine aranması amaçlanıyorsa, utf8_general_ci veya utf8_unicode_ci kullanın. Her ikisi de büyük / küçük harfe duyarsızdır, biri yavaşça eşleşir ('ß', 's' değerine eşittir, 'ss' değerine eşit değildir). Kaybedilen eşleşmenin belirtilen dil için daha uygun olduğu utf8_german_ci gibi dile özgü sürümler de vardır.

[Düzenle - yaklaşık 6 yıl sonra]

Artık MySQL'de "utf8" karakter kümesini önermiyorum ve bunun yerine "utf8mb4" karakter kümesini öneriyorum. Neredeyse tamamen eşleşiyorlar, ancak biraz (çok) daha unicode karakterlere izin veriyorlar.

Gerçekçi olarak, MySQL "utf8" karakter setini ve ilgili harmanlamaları "utf8" spesifikasyonuna uyacak şekilde güncellemeli, bunun yerine, ayrı bir karakter seti ve zaten tamamlanmamış "utf8" karakter setini kullananlar için depolama atamasını etkilememelidir. .


5
Bilginize: utf8_unicode_csmevcut değil. Büyük / küçük harfe duyarlı utf8 utf8_bin. Sorun utf8_binsıralama yanlış. Bakınız: stackoverflow.com/questions/15218077/…
Costa

1
Güncelleme için teşekkürler!
Prometheus


2

Veritabanı yükleme dosyanıza aşağıdaki satırı herhangi bir satırın önüne ekleyin:

SET NAMES utf8;

Ve sorunun çözülmeli.


2
Bir soru okuyun: Geçmişte PHP'yi "UTF-8" 'de çıkacak şekilde ayarladım, ancak bu MySQL'de hangi harmanlama ile eşleşiyor? UTF-8 olanlardan biri olduğunu düşünüyorum, ama daha önce utf8_unicode_ci, utf8_general_ci ve utf8_bin kullandım.
Jitesh Sojitra

5
Bu cevabın soru ile ilgisi yoktur. Ayrıca, SET NAMESdoğrudan bir sorgu verilmesi , istemcinin kodlama hakkında bilgi vermesine izin vermez ve hazırlanmış ifadeler gibi belirli özellikleri çok ince bir şekilde bozabilir.
Álvaro González
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.