O MySQL tipo de intercalação precisa combinar página PHP tipo charset?

votos
3

Eu comecei a depuração meu feed RSS porque tem alguns caracteres estranhos nele (isto é o glifo caracteres faltando). Comecei com dois excelentes recursos iniciantes:

A razão que eu acredito que o nosso feed RSS está tendo problemas é porque os usuários são cópia & pasteing documentos do MS Word em uma textarea no site e nossas páginas PHP está usando o charset iso-8859-1, que é incompatível com o especial Windows-1252 codificações para coisas como pontos de bala e citações inteligentes usados ​​pelo MS Word.

Então, eu estou esperando para corrigir o problema, tudo o que você precisa fazer é começar a usar utf-8 nas páginas que levam / dar entrada do usuário ??. Ou seja, definir o seguinte na seção HEAD:

<meta http-equiv=Content-Type content=text/html;charset=utf-8 />

A verdadeira razão pela qual eu estou levantando esta questão, porém, é porque meus campos DB que armazenam a minha entrada do usuário estão em latin1_swedish_ci e eu quero saber se eu preciso converter-los para utf8_general_ci? MySQL realmente não se preocupam com o charset não é? Ele só vê um monte de bytes e Se eu colocar Unicode para um campo ordenada como Latina que ainda vai voltar para fora como Unicode certo? Alterar o campo vai ser cansativo, porque o campo é parte de um índice FULLTEXT onde os outros campos também vai precisar de sua mudança agrupamento que significa descartar o índice e reconstruí-lo (o que não é tarefa fácil quando há grandes quantidades de texto envolvidos).

Publicado 12/05/2009 em 12:22
fonte usuário
Em outras línguas...                            


4 respostas

votos
6

A verdadeira razão pela qual eu estou levantando esta questão, porém, é porque meus campos DB que armazenam a minha entrada do usuário estão em "latin1_swedish_ci" e eu quero saber se eu preciso converter-los para "utf8_general_ci"?

No. latin1_swedish_cie utf8_general_cisão agrupamentos - não charsets. O agrupamento não afetará a maneira que os personagens são armazenados ou de entrada / saída. Ele só controla como funções de ordenação encomendar os seus resultados. O agrupamento - a funcionar como esperado - deve corresponder ao conjunto de caracteres de armazenamento. Então, se suas tabelas são armazenados em UTF-8, você deve usar um agrupamento utf8.

O charset armazenamento para mysql não está diretamente ligada à charset em php. Você pode usar UTF-8 como o conjunto de caracteres de armazenamento para o MySQL, enquanto estiver usando iso-8859-1 em php. Nesse caso, você precisa dizer ao MySQL sobre isso, definindo o conjunto de caracteres da conexão ( set names XXX). Mysql irá então converter conforme necessário. Se você não usar o mesmo charset em MySQL e PHP, você vai acabar com a capacidade charset que é o menor denominador dommon, por isso mesmo que as cordas são armazenados em UTF-8, você não terá a gama unicode cheio de personagens acessível. Portanto, você deve usar utf8 em ambos MySQL e PHP.

Respondeu 12/05/2009 em 13:42
fonte usuário

votos
1

Para salvar alguém algum tempo pesquisando para saber como alterar a conexão mysql charset bem com DOP / mysql aqui é como eu fazê-lo:

$dbc = new pdo('mysql:dbname=DBNAME;host=DBHOST', $user, $pw, array(PDO::MYSQL_ATTR_INIT_COMMAND => sprintf( "SET NAMES %s", $charset ) ) );
Respondeu 12/05/2009 em 21:57
fonte usuário

votos
1

Não - definitivamente não. Como MySQL posseses a capacidade de transformar cordas de um conjunto de caracteres em outro na mosca, é importante ainda que o servidor MySQL sabe o conjunto de caracteres que você está trabalhando no lado do cliente (script do lado = PHP cliente, não o cliente acessar o seu página da web). Isto pode ser feito através da emissão a consulta

SET NAMES 'utf8';

antes de qualquer outra consulta que você enviar para o servidor. MySQL irá, em seguida, fazer as conversões apropriadas de seu personagem cliente definir no personagem MySQL interno definido no personagem mesa e / ou coluna definida e todo o caminho de volta. Então, geralmente você só tem que se preocupar sobre como definir o conjunto de caracteres cliente correto. Este conjunto de caracteres deve corresponder ao conjunto de caracteres que você usa para saída de seus dados para o servidor web.

Por favor, dê uma olhada no manual do MySQL:

Respondeu 12/05/2009 em 12:36
fonte usuário

votos
0

Em HTTP a codificação de caracteres é declarado pelo charsetparâmetro no Content-Typecampo de cabeçalho de resposta HTTP. Outra declaração são substituídos pela declaração no cabeçalho HTTP :

[...] agentes de usuário deve observar as seguintes prioridades para determinar a codificação de caracteres de um documento (da mais alta prioridade para a menor):

  1. Um HTTP " charset" parâmetro em um " Content-Typecampo".
  2. Uma METAdeclaração com " http-equiv" definido para " Content-Type" e um valor definido para " charset".
  3. O charsetconjunto de atributos em um elemento que designa um recurso externo.

Além disso, você deve declarar explicitamente a codificação de caracteres aceitos com o accept-charsetatributo do formelemento. Caso contrário, o agente de utilizador pode tomar (mas não) ser a codificação de caracteres usado no documento de formulário para codificar os dados de entrada:

O valor padrão para este atributo é a string reservada "desconhecido". Os agentes podem interpretar este valor como a codificação de caracteres que foi utilizada para transmitir o documento contendo este FORMelemento.

Isso deve lhe dar a melhor chance de que os dados de entrada é codificado corretamente. Mas não é guarateed. Então é melhor verificar se os dados são efectivamente codificado com UTF-8 (existem funções / algoritmos para fazer isso).

Respondeu 12/05/2009 em 12:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more