mariadb UTF-8字符的问题;我看到的不是我储存的

plupiseo  于 2022-11-08  发布在  其他
关注(0)|答案(5)|浏览(214)

我尝试使用UTF-8,但遇到了麻烦。
我已经尝试了这么多的事情;以下是我得到的结果:

  • ????而不是亚洲字符。即使是欧洲文本,我也得到了Se?orSeñor
  • 奇怪的乱码(乱码?),例如Señor新浪新闻表示新浪新闻
  • 黑钻石,如先生。
  • 最后,我遇到了数据丢失或至少被截断的情况:将Se转换为Señor
  • 即使当我得到的文本 * 看 * 的权利,它没有 * 排序 * 正确。

我做错了什么?我如何修复 * 代码 *?我可以恢复 * 数据 * 吗?如果可以,如何恢复?

yruzcnhs

yruzcnhs1#

这个问题困扰着这个网站的参与者和许多其他人。
您已经列出了CHARACTER SET故障的五种主要情况。

最佳实践

今后,最好使用CHARACTER SET utf8mb4COLLATION utf8mb4_unicode_520_ci。(管道中有一个新版本的Unicode排序规则。)
utf8mb4utf8的超集,因为它处理4字节的utf8代码,这是表情符号和一些中文所需要的。
在MySQL之外,“UTF-8”指的是所有大小编码,因此实际上与MySQL的utf8mb4相同,而不是utf8
在下面的内容中,我将尝试使用这些拼写和大写来区分MySQL内部和外部。

您 * 应该 * 做什么的概述

  • 将您的编辑器等设置为UTF-8。
  • HTML表单应该以<form accept-charset="UTF-8">开头。
  • 将字节编码为UTF-8。
  • 将UTF-8设置为客户端中使用的编码。
  • 将列/表声明为CHARACTER SET utf8mb4(使用SHOW CREATE TABLE检查。)
  • <meta charset=UTF-8>位于HTML的开头
  • 存储例程获取当前的字符集/排序规则。它们可能需要重建。

计算机语言的更多详细信息(及其后续章节)

测试数据

使用工具或SELECT查看数据是不可信的。太多这样的客户端,尤其是浏览器,试图补偿不正确的编码,并显示正确的文本,即使数据库被损坏。因此,选择一个表和列,其中有一些非英语文本,并执行

SELECT col, HEX(col) FROM tbl WHERE ...

正确存储的UTF-8的十六进制将为

  • 对于空格(任何语言):20
  • 英文版:4x5x6x7x
  • 对于大多数西欧国家,重音字母应为Cxyy
  • 西里尔文、希伯来文和波斯文/阿拉伯文:Dxyy
  • 亚洲大部分地区:Exyyzz
  • 表情符号和一些中文:x1米20英寸
  • 更多详细信息
    所见问题的具体原因和解决方法
    截断的文本(SeSeñor):
  • 要存储的字节未编码为utf8 mb 4。请修复此问题。
  • 此外,请检查读取期间的连接是否为UTF-8。
    黑色菱形,带问号(Se�or代表Señor);存在以下情况之一:

第1种情况(原始字节 * 不是 * UTF-8):

  • 要存储的字节未编码为utf8。请修复此问题。
  • INSERT * 和 * SELECT的连接(或SET NAMES)不是utf8/utf8 mb 4。请修复此问题。
  • 此外,请检查数据库中的列是否为CHARACTER SET utf8(或utf8 mb 4)。

例2(原始字节 were UTF-8):

  • SELECT的连接(或SET NAMES)不是utf8/utf8 mb 4。请修复此问题。
  • 此外,请检查数据库中的列是否为CHARACTER SET utf8(或utf8 mb 4)。

只有在浏览器设置为<meta charset=UTF-8>时,才会出现黑色菱形。

问号(常规问号,非黑色菱形)(Se?or代表Señor):

  • 要存储的字节未编码为utf8/utf8 mb 4。请修复此问题。
  • 数据库中的列不是CHARACTER SET utf8(或utf8 mb 4)。请修复此问题。(使用SHOW CREATE TABLE。)
  • 此外,请检查读取期间的连接是否为UTF-8。
    乱码乱码SeñorSeñor):(此讨论也适用于Double Encoding,它不一定是可见的。)
  • 要存储的字节必须是UTF-8编码。请修复此问题。
  • INSERTingSELECTing文本需要指定utf8或utf8 mb 4时的连接。修复此问题。
  • 列需要声明为CHARACTER SET utf8(或utf8 mb 4)。请修复此问题。
  • HTML应该以<meta charset=UTF-8>开头。

如果数据看起来正确,但排序不正确,则可能是您选择了错误的排序规则,或者没有符合您需要的排序规则,或者您使用了Double Encoding

双重编码可通过执行上述SELECT .. HEX ..来确认。

é should come back C3A9, but instead shows C383C2A9
The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD

也就是说,十六进制的长度大约是它应该长度的两倍。这是由于从latin 1(或其他)转换为utf8,然后将这些字节视为latin 1并重复转换而导致的。排序(和比较)无法正常工作,因为它将字符串视为Señor

尽可能修复数据

对于截断问号,数据将丢失。
对于乱码/双重编码,...
对于黑钻,...

修复在此列出。(5种不同情况下的5种不同修复;仔细挑选):http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

xqk2d5yq

xqk2d5yq2#

我的两个项目在服务器迁移后也遇到过类似的问题。在搜索和尝试了很多解决方案后,我遇到了这个问题:

mysqli_set_charset($con,"utf8mb4");

在将这一行添加到我的配置文件后,一切都工作正常!
我在寻找解决HTML查询中的插入问题时,发现了MySQLi-* PHP mysqli set_charset() Function * 的解决方案。

mmvthczy

mmvthczy3#

我也在寻找同样的问题,我花了近一个月的时间才找到合适的解决方案。
首先,你必须更新你的数据库,将所有最近的CHARACTER和COLLATION转换为utf8 mb 4或至少支持UTF-8的数据。
对于Java:
在建立JDBC连接时,将其添加到连接URL useUnicode=yes&characterEncoding=UTF-8 作为参数,它将工作。
对于Python:
在查询数据库之前,请尝试对游标强制执行此操作

  • 一个月一个月一个月一个月一个月一个月一个月一个月一个月二个月一个月 *

如果它不起作用,快乐寻找正确的解决方案。

eeq64g8w

eeq64g8w4#

1.将代码IDE语言设置为UTF-8
1.添加到您收集数据表单网页页眉
1.检查您的MySQL表定义是否如下所示:

CREATE TABLE your_table (
   ...
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.如果您使用PDO,请确保

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8');
$dbL = new PDO($pdo, $user, $pass, $options);

如果你已经有了一个有上述问题的大型数据库,你可以尝试用SIDU导出正确的字符集,然后用UTF-8导入回来。

sg2wtvxw

sg2wtvxw5#

根据服务器的设置,你必须相应地改变编码。你所说的utf8应该是最好的。但是,如果你得到奇怪的字符,它可能会帮助你改变网页编码为ANSI。
这对我设置PHP MySQLi很有帮助。这可能会帮助您了解更多:ANSI to UTF-8 in Notepad++

相关问题