Como posso processar dados para evitar MySQL erro "valor de cadeia incorrecto"?

votos
4

Eu estou tentando usar uma tarefa Rake para migrar alguns dados legados de MS Access para MySQL. Eu estou trabalhando em Windows XP, usando o Ruby 1.8.6.

Eu tenho a codificação para Rails definidos como utf8 in database.yml.

Além disso, o conjunto de caracteres padrão para MySQL é utf8.

99% dos dados está chegando bem, mas de vez em quando eu vou obter um valor de coluna que me dá uma coisa erro como este:

Mysql::Error: Incorrect string value: '\x92 Comm...' for column 'name' 
  at row 1: 
  INSERT IGNORE  INTO `organizations` ( [...] ) 
  VALUES('Lawyers’ Committee', [...] )

Parece que a única coisa que está dando MySQL problema é o apóstrofo imediatamente após o s na palavra Advogados.

Aqui está mais um...

Mysql::Error: Incorrect string value: '\x99 aoc' for column 'department' 
  at row 1: 
  INSERT IGNORE  INTO `addresses` 
[...]
  'TRInfo™ aoc'
[....]

Parece que está engasgada com o TM depois TRInfo.

Existe algum método Ruby ou Rails que eu possa executar os dados através de purificar de que quaisquer caracteres que o MySQL vai sufoca?

Idealmente, seria ótimo para substituí-los com personagens mais palatáveis ​​- substituir o apóstrofo com aspas simples e o símbolo TM com a string (TM).

Ou, se eu pudesse de alguma forma configurar o MySQL para armazenar esses personagens como está sem erros que seria ótimo também.

Publicado 04/06/2009 em 01:17
fonte usuário
Em outras línguas...                            


7 respostas

votos
0

Parece que o seu banco de dados antigo está em um formato string (utf8?) E seus trilhos está esperando algo mais. Se você entrada está em utf8, você já tentou configurar os trilhos para apoiá-lo?

Respondeu 04/06/2009 em 01:33
fonte usuário

votos
6

Parece que o seu dados de entrada não está em utf-8.

Eu fiz um pouco de investigação e a citação estilo usado em advogado do é codificado como \ x92 na codificação do Windows-1252, mas seria absurdo para utf8 (quando eu decodificado-lo e codificado-lo em UTF-8, eu tenho \ XE2 \ x80 \ x99).

Assim, você precisará converter as cadeias de entrada de windows-1252 para utf-8 (ou para unicode).

Respondeu 04/06/2009 em 03:37
fonte usuário

votos
1

Eu tive o mesmo problema quando colocar conteúdo de arquivos UTF-16 codificado - que geralmente armazenam um personagem por bloco de 16 bits - em tabelas MySQL com java. O problema foi que a string UTF-16 codificado continha assim chamados pares substitutos . Significa dois 16bit consecutivo UTF-16 blocos codificar um carácter especial, mas não pode ser traduzida para uma correspondente codificação UTF-8 individualmente. Veja wikipedia para mais explicações.

A solução foi simplesmente substituir estes caracteres com espaços. Este é o intervalo de caracteres que você pode querer tirar proveito de sua string: U + D800-U + DFFF

Respondeu 30/04/2010 em 16:39
fonte usuário

votos
1

Em geral, isso acontece quando você inserir texto para colunas com incompatível codificação / agrupamento.

Eu tenho esse erro quando eu tinha gatilhos, que herdam agrupamento do servidor por algum motivo. E padrão do MySQL é (pelo menos no Ubuntu) latin-1 com agrupamento sueco. Mesmo que eu tivesse banco de dados e todas as tabelas definidas para UTF-8, eu ainda tinha que definir my.cnf:

/etc/mysql/my.cnf:

[mysqld]
character-set-server=utf8
default-character-set=utf8

E isso deve listar todos os disparadores com utf8- *:

select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS

E alguns de variáveis ​​listadas por isso também deve ter utf-8 * (nenhuma codificação Latin-1 ou outro):

show variables like 'char%';
Respondeu 20/07/2012 em 14:12
fonte usuário

votos
0
Eu encontrei o mesmo problema hoje.
Depois tentei muitas vezes, eu descobri a razão e corrigi-lo, finalmente.
Para aplicações que armazenam dados usando o personagem MySQL padrão definido e agrupamento (latin1, latin1_swedish_ci), então você precisa para especificar o conjunto de caracteres e collation para utf8 / utf8_general_ci quando o criar seu banco de dados ou tabela.
por exemplo:
        $ Sql ​​= "CREATE TABLE". $ Table_name. "(
        MEDIUMINT id (9) NOT NULL AUTO_INCREMENT,
        VARCHAR bookname (128) não nulo,
        varchar autor (64) NOT NULL,
        PRIMARY KEY (id),
        CHAVE (bookname)
        ) CHARACTER SET utf8 COLLATE utf8_general_ci; ";

Referência:
"Mysql criar problema mesa? RESOLVIDO !!!!!!!!!!! "
http://forums.mysql.com/read.php?121,193883,193883
"10.1.5. Configurando o Conjunto de Caracteres e Collation para Applications "
http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

Esperando que isso pode ajudá-lo.
Respondeu 25/11/2012 em 17:54
fonte usuário

votos
0

Adicionando binário antes da weirdcolumn resolve o problema.

No meu caso, eu tenho um disparador de atualização na tableA para inserir dados em outra tabela. Existem alguns caracteres especiais em weirdcolumn coluna e a atualização falhou com a mensagem: "Erro 1366 (HY000): valor de cadeia incorrecto: '\ XE7 ....'"

Depois que eu cavar muito, eu encontrei a solução pela adição de binário antes de o nome da coluna corda, ou usando elenco (weirdcolumn como binário);

Espero que isso possa ajudar.

Respondeu 23/07/2015 em 18:57
fonte usuário

votos
0

Eu tive o mesmo problema a importação de dados do SQL Server para MySql usando PHP. Minha solução foi utf8_encode()ao inserir em MySql e usar utf8_decode()ao recuperar a partir do MySQL para exibir no navegador. Aqui você tem o meu código completo, que funciona bem.

//For string values
$Gro2=(is_null($row["GrpNm"]))?"NULL":"\"".mysql_escape_string(utf8_encode($row["GrpNm"]))."\"";


$sqlMy ="INSERT IGNORE  INTO `tbl_name` VALUES ($Gro2)";

Atenção: Para novos projetos usar

mysqli_escape_string()

ligação

Respondeu 27/01/2016 em 16:41
fonte usuário

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