Estou tentando descobrir qual agrupamento devo usar para vários tipos de dados. 100% do conteúdo que armazenarei é enviado pelo usuário.
Meu entendimento é que eu deveria usar o IC geral UTF-8 (sem distinção entre maiúsculas e minúsculas) em vez do binário UTF-8. No entanto, não consigo encontrar uma distinção clara entre o IC geral UTF-8 e o IC Unicode UTF-8.
- Devo estar armazenando o conteúdo enviado pelo usuário nas colunas UTF-8 General ou UTF-8 Unicode CI?
- A que tipo de dados o UTF-8 Binary se aplica?
utf8
, use emutf8mb4
vez disso para suporte total ao UTF-8. Comentando aqui porque as respostas sobre essa pergunta popular não abordam isso. mathiasbynens.be/notes/mysql-utf8mb4Respostas:
Em geral, utf8_general_ci é mais rápido que utf8_unicode_ci , mas menos correto.
Aqui está a diferença:
Citado em: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Para uma explicação mais detalhada, leia a seguinte publicação nos fóruns do MySQL: http://forums.mysql.com/read.php?103,187048,188748
Quanto ao utf8_bin: utf8_general_ci e utf8_unicode_ci executam uma comparação que não diferencia maiúsculas de minúsculas. Em contraste, utf8_bin faz distinção entre maiúsculas e minúsculas (entre outras diferenças), porque compara os valores binários dos caracteres.
fonte
show collation;
você pode ver o agrupamento padrão para cada conjunto de caracteres. 5.1 mostrautf8_general_ci
como padrão parautf8
.Você também deve estar ciente do fato de que, com utf8_general_ci ao usar um campo varchar como índice exclusivo ou primário, inserir 2 valores como 'a' e 'á' causaria um erro de chave duplicado.
fonte
utf8_unicode_ci
utf8_bin
compara os bits cegamente. Nenhuma caixa dobrável, sem sotaque.utf8_general_ci
compara um byte com um byte. Faz caso dobrável e remoção de sotaque, mas nenhuma comparação de dois caracteres:ij
não é igualij
neste agrupamento.utf8_*_ci
é um conjunto de regras específicas do idioma, mas de outro modo semelhanteunicode_ci
. Alguns casos especiais:Ç
,Č
,ch
,ll
utf8_unicode_ci
segue um antigo padrão Unicode para comparações.ij
=ij
, masae
! =æ
utf8_unicode_520_ci
segue um padrão Unicode mais recente.ae
=æ
Vejo tabela de agrupamentos para obter detalhes sobre o que é igual ao que em vários agrupamentos utf8.
utf8
, conforme definido pelo MySQL, é limitado aos códigos utf8 de 1 a 3 bytes. Isso deixa Emoji e alguns chineses. Então você deve realmente mudar parautf8mb4
se quiser ir muito além da Europa.Os pontos acima se aplicam a
utf8mb4
, após a alteração ortográfica adequada. No futuro,utf8mb4
eutf8mb4_unicode_520_ci
são os preferidos.fonte
Realmente, testei salvar valores como 'é' e 'e' na coluna com valores únicos índice e eles causam erros duplicados em 'utf8_unicode_ci' e 'utf8_general_ci'. Você pode salvá-los somente na coluna intercalada 'utf8_bin'.
E os documentos do mysql (em http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) sugerem em seus exemplos o conjunto 'utf8_general_ci'.
fonte
A resposta aceita está desatualizada.
Se você usa o MySQL 5.5.3+, use em
utf8mb4_unicode_ci
vez deutf8_unicode_ci
para garantir que os caracteres digitados pelos usuários não apresentem erros.utf8mb4
suporta emojis, por exemplo, enquantoutf8
pode oferecer centenas de bugs relacionados à codificação, como:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
fonte
utf8mb4_unicode_ci
trata (eu acho) todos os Emoji iguais.utf8mb4_unicode_520_ci
dá um pedido a Emoji.