如何解决“错误的string值”错误?

在注意到应用程序倾向于由于错误的string值错误而放弃随机电子邮件之后,我去了并切换了许多文本列以使用utf8列字符集和默认列分类( utf8_general_ci ),以便它们能够接受它们。 这固定了大部分的错误,并且使应用程序在碰到非拉丁邮件时也不会收到sql错误。

尽pipe如此,一些电子邮件仍然导致程序击中不正确的string值错误:( (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)

内容列是使用utf8列字符集和utf8_general_ciMEDIUMTEXT MEDIUMTEXT数据。 没有可以在此栏中切换的标志。

请记住,除非绝对必要,否则我不想触及甚至查看应用程序源代码:

  • 什么是造成这个错误? (是的,我知道电子邮件是随机垃圾,但我认为utf8会相当宽容)
  • 我该如何解决?
  • 这种修复的可能影响是什么?

我考虑的一件事情是在打开二进制标志的情况下切换到utf8 varchar([some large number]),但是我对MySQL不太熟悉,不知道这样的修复是否合理。

"\xE4\xC5\xCC\xC9\xD3\xD8"不是有效的UTF-8。 使用Pythontesting:

 >>> "\xE4\xC5\xCC\xC9\xD3\xD8".decode("utf-8") ... UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data 

如果您正在寻找避免在数据库中解码错误的方法,那么cp1252编码(又名“Windows-1252”又名“Windows西欧”)是最宽松的编码 – 每个字节值都是一个有效的编码点。

当然,它不会再理解真正的UTF-8了,也不会有任何其他的非cp1252编码,但是这听起来像你不太在意?

我不会build议Richies回答,因为你搞砸了数据库中的数据。 你不会解决你的问题,而是试图“隐藏”它,不能用废话的数据执行基本的数据库操作。

如果遇到此错误,您要发送的数据不是UTF-8编码,或者您的连接不是UTF-8。 首先,validation数据源(一个文件,…)是否真的是UTF-8。

然后,检查你的数据库连接,连接后应该这样做:

 SET NAMES 'utf8'; SET CHARACTER SET utf8; 

接下来,validation存储数据的表具有utf8字符集:

 SELECT `tables`.`TABLE_NAME`, `collations`.`character_set_name` FROM `information_schema`.`TABLES` AS `tables`, `information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations` WHERE `tables`.`table_schema` = DATABASE() AND `collations`.`collation_name` = `tables`.`table_collation` ; 

最后,检查你的数据库设置:

 mysql> show variables like '%colla%'; mysql> show variables like '%charac%'; 

如果源代码,传输和目的地是UTF-8,你的问题就没有了;)

MySQL的utf-8types实际上并不是恰当的utf-8 – 它只使用每个字符三个字节,并且只支持基本多语言平面(即没有表情符号,没有星体平面等)。

如果您需要存储更高Unicode平面的值,则需要使用utf8mb4编码 。

我今天通过将列更改为'LONGBLOB'types来解决此问题,该types存储原始字节而不是UTF-8字符。

这样做的唯一缺点是你必须自己照顾编码。 如果您的应用程序的一个客户端使用UTF-8编码,而另一个客户端使用CP1252,则可能会发送带有不正确字符的电子邮件。 为避免这种情况,请始终在所有应用程序中使用相同的编码(例如UTF-8)

有关TEXT / LONGTEXT和BLOB / LONGBLOB之间差异的更多详细信息,请参阅此页http://dev.mysql.com/doc/refman/5.0/en/blob.html 。 网上也有很多其他论点讨论这两个问题。

表和字段有错误的编码; 但是,您可以将它们转换为UTF-8。

 ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci; 

一般来说,当您将string插入到不兼容的编码/sorting规则的列时,会发生这种情况。

当我有TRIGGERs,由于某种原因inheritance服务器的sorting规则时,我得到了这个错误。 和MySQL的默认是(至less在Ubuntu)与瑞典sorting拉丁语-1。 即使我有数据库和所有表设置为UTF-8,我还没有设置my.cnf

/etc/mysql/my.cnf:

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

这个必须用utf8- *列出所有触发器:

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

还有一些由此列出的variables也应该有utf-8- *(不拉丁-1或其他编码):

 show variables like 'char%'; 

首先检查你的default_character_set_name是否是utf8。

 SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "DBNAME"; 

如果结果不是utf8,你必须转换你的数据库。 起初,你必须保存一个转储。

要将指定数据库中所有表的字符集编码更改为UTF-8,请在命令行键入以下命令。 将DBNAMEreplace为数据库名称:

 mysql --database=DBNAME -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql --database=DBNAME 

要将数据库本身的字符集编码更改为UTF-8,请在mysql >提示符处键入以下命令。 将DBNAMEreplace为数据库名称:

 ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci; 

您现在可以重试将utf8字符写入您的数据库。 当我尝试上传200000行的CSV文件到我的数据库时,这个解决scheme帮助我。

这个错误意味着要么你有string编码不正确(例如,你试图inputISO-8859-1编码的string到UTF-8编码的列),或者列不支持你要input的数据。

在实践中,后一个问题是由MySQL UTF-8实现引起的,它只支持以UTF-8表示的需要1-3个字节的UNICODE字符。 尝试通过JDBC将UTF-8插入到MySQL中时请参阅“不正确的string值”? 了解详情。

我得到了一个类似的错误( Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1 )。 我试图将列的字符集更改为utf8mb4 ,之后,错误已经更改为'Data too long for column 'content' at row 1'
原来,MySQL显示我错误的错误。 我将列的字符集转回到utf8 ,并将列的types更改为MEDIUMTEXT 。 之后,错误消失了。
我希望它可以帮助别人。
顺便说一句MariaDB(我已经testing了相同的INSERT),只是剪切文本没有错误。

我已经尝试了所有的上述解决scheme(这些解决scheme都带来了有效的观点),但是对我来说什么都没有。

直到我发现我在C#中的MySQL表字段映射使用了一个不正确的types: MySqlDbType.Blob 。 我将其更改为MySqlDbType.Text ,现在我可以编写所有我想要的UTF8符号!

ps我的MySQL表格字段是“LongText”types。 但是,当我使用MyGeneration软件自动生成字段映射时,它会自动将字段types设置为C#中的MySqlDbType.Blob。

有趣的是,我一直使用带有UTF8字符的MySqlDbType.Blobtypes几个月没有麻烦,直到有一天我试图写一个string与一些特定的字符。

希望这有助于那些正在努力寻找错误原因的人。

对于我运行到这个不正确的string值的解决scheme:'\ xF8'列错误使用scriptcase是要确保我的数据库设置为utf8通用ci和我的字段sorting规则。 然后当我做我的数据导入一个csv文件,我加载到UE Studio的CSV,然后保存它格式为UTF8和瞧! 它像一个魅力,29000logging在那里没有错误。 以前我试图导入一个Excel创build的CSV。

我在列名之前添加了二进制,并解决了字符集错误。

插入到tableA值(binary stringcolname1);

尽pipe您的sorting规则设置为utf8_general_ci,但我怀疑数据库,表格甚至列的字符编码可能不同。

 ALTER TABLE tabale_name MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; 

嗨,我也有这个错误,当我使用我的在线数据库从godaddy服务器,我认为它有5.1或更多的MySQL版本。 但是当我从我的本地主机服务器(版本5.7)做的很好,之后,我从本地服务器创build表,并复制到使用MySQL的MySQL在线服务器我认为问题是与字符集

这里截图

就我而言,首先我遇到了“???” 在我的网站上,然后我检查MySQL的字符集,这是拉丁现在,所以我把它改成utf-8,然后我重新启动我的项目,然后我得到了同样的错误,然后我发现我忘记了改变数据库的字符集并改变为utf-8,繁荣,它的工作。

为了解决这个错误,我把我的MySQL数据库升级到了utf8mb4,它支持完整的Unicode字符集。 我build议仔细阅读,因为有很多问题(例如,由于新的编码需要修改字段types,索引键可能会变得太大)。

这里有很好的答案。 我只是添加我的,因为我遇到了同样的错误,但事实certificate是一个完全不同的问题。 (也许在表面上是一样的,但是不同的根本原因。)

对于我来说,错误发生在以下领域:

 @Column(nullable = false, columnDefinition = "VARCHAR(255)") private URI consulUri; 

这最终被存储在数据库中,作为URI类的二进制序列化。 这没有提出unit testing(使用H2)或CI /集成testing(使用MariaDB4j )的任何标志,它在我们的生产类似的设置爆炸。 (但是,一旦问题被理解了,很容易在MariaDB4j实例中看到错误的值;它只是没有炸掉testing。)解决scheme是构build一个自定义types映射器:

 package redacted; import javax.persistence.AttributeConverter; import java.net.URI; import java.net.URISyntaxException; import static java.lang.String.format; public class UriConverter implements AttributeConverter<URI, String> { @Override public String convertToDatabaseColumn(URI attribute) { return attribute.toString(); } @Override public URI convertToEntityAttribute(String field) { try { return new URI(field); } catch (URISyntaxException e) { throw new RuntimeException(format("could not convert database field to URI: %s", field)); } } } 

用法如下:

 @Column(nullable = false, columnDefinition = "VARCHAR(255)") @Convert(converter = UriConverter.class) private URI consulUri; 

就Hibernate而言,它似乎有一大堆提供的types映射器 ,包括java.net.URL ,但不包括java.net.URI (这是我们在这里需要的)。

1 – 您必须在您的连接中声明使用UTF8的属性。 http://php.net/manual/en/mysqli.set-charset.php

2 – 如果你使用mysql命令行来执行一个脚本,你必须使用标志,例如: Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql