如何修复“不正确的字符串值”错误?

insrf1ej  于 2021-06-18  发布在  Mysql
关注(0)|答案(21)|浏览(937)

在注意到一个应用程序由于不正确的字符串值错误而倾向于丢弃随机电子邮件之后,我还是切换了许多文本列以使用 utf8 列字符集和默认列collate( utf8_general_ci )让它接受他们。这修复了大多数错误,并使应用程序在遇到非拉丁电子邮件时也不再出现sql错误。
尽管如此,一些电子邮件仍然导致程序出现错误的字符串值错误: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1) “内容”列是 MEDIUMTEXT 使用 utf8 列字符集和 utf8_general_ci 列比较。此列中没有可切换的标志。
请记住,除非绝对必要,否则我不想接触或查看应用程序源代码:
是什么导致了这个错误(是的,我知道邮件里都是随机垃圾,但我认为utf8是相当宽容的)
我该怎么修?
这样的修复有什么可能的影响?
我考虑过的一件事是切换到启用二进制标志的utf8varchar([一些大的数字]),但我对mysql相当陌生,不知道这样的修复是否有意义。

n6lpvg4x

n6lpvg4x16#

在我的例子中,通过将mysql列编码更改为“binary”(数据类型将自动更改为varbinary)解决了这个问题。可能我无法过滤或搜索该列,但我不需要它。

envsm3lx

envsm3lx17#

通常,在向编码/排序规则不兼容的列插入字符串时会发生这种情况。
我在使用触发器时遇到了这个错误,因为某些原因,触发器继承了服务器的排序规则。mysql的默认值是(至少在ubuntu上)拉丁文-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

其中列出的一些变量也应该有utf-8-*(没有拉丁语-1或其他编码):

show variables like 'char%';
sycxhyv7

sycxhyv718#

为了修复这个错误,我将mysql数据库升级到utf8mb4,它支持完整的unicode字符集,具体步骤如下。我建议仔细阅读,因为有很多问题(例如,由于新的编码,索引键可能会变得太大,之后必须修改字段类型)。

pgccezyw

pgccezyw19#

我不建议richies回答,因为你把数据库里的数据搞砸了。你不会解决你的问题,但试图“隐藏”它,不能执行基本的数据库操作的垃圾数据。
如果您遇到此错误,或者您发送的数据不是utf-8编码的,或者您的连接不是utf-8。首先,验证数据源(文件,…)是否真的是utf-8。
然后,检查数据库连接,连接后应执行以下操作:

SET NAMES 'utf8';
SET CHARACTER SET utf8;

接下来,验证存储数据的表是否具有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,那么问题就没有了;)

tquggr8v

tquggr8v20#

遇到以下不正确的字符串值时,我的解决方案是:使用scriptcase的column error的“\xf8”必须确保数据库是为utf8 general ci设置的,字段排序规则也是如此。然后,当我做我的数据导入一个csv文件我加载到ue工作室csv,然后保存为utf8格式和瞧!它就像一个魔咒,29000张记录中没有错误。以前我试图导入一个excel创建的csv。

t3irkdon

t3irkdon21#

我今天解决了这个问题,将列改为“longblob”类型,它存储原始字节而不是utf-8字符。
这样做的唯一缺点是您必须自己处理编码。如果应用程序的一个客户机使用utf-8编码,而另一个客户机使用cp1252,则您的电子邮件可能会使用不正确的字符发送。为了避免这种情况,请在所有应用程序中始终使用相同的编码(例如utf-8)。
请参阅本页http://dev.mysql.com/doc/refman/5.0/en/blob.html 有关text/longtext和blob/longblob之间差异的更多详细信息。网上也有许多其他的论据讨论这两个问题。

相关问题