Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql UTF-8字符故障;我看到的不是我储存的_Mysql_Unicode_Utf 8_Character Encoding_Mariadb - Fatal编程技术网

Mysql UTF-8字符故障;我看到的不是我储存的

Mysql UTF-8字符故障;我看到的不是我储存的,mysql,unicode,utf-8,character-encoding,mariadb,Mysql,Unicode,Utf 8,Character Encoding,Mariadb,我试图使用UTF-8,但遇到了麻烦 我试过很多东西;以下是我得到的结果: ??而不是亚洲字符。即使是欧洲文本,我也得到了Se?或Señ或 奇怪的胡言乱语(莫吉巴克?),如Señ或或新浪新闻 黑钻石,如硒�或者 最后,我遇到了数据丢失或至少被截断的情况:SeforSeñor 即使我让文本看起来正确,它也没有正确排序 我做错了什么?如何修复代码?我可以恢复数据吗?如果可以,如何恢复?这个问题困扰着本网站的参与者和许多其他人 您已经列出了字符集出现故障的五种主要情况 最佳实践 接下来,最好使用字

我试图使用UTF-8,但遇到了麻烦

我试过很多东西;以下是我得到的结果:

  • ??
    而不是亚洲字符。即使是欧洲文本,我也得到了
    Se?或
    Señ或
  • 奇怪的胡言乱语(莫吉巴克?),如
    Señ或
    新浪新闻
  • 黑钻石,如硒�或者
  • 最后,我遇到了数据丢失或至少被截断的情况:
    Se
    for
    Señor
  • 即使我让文本看起来正确,它也没有正确排序

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

这个问题困扰着本网站的参与者和许多其他人

您已经列出了字符集出现故障的五种主要情况

最佳实践

接下来,最好使用
字符集utf8mb4
排序规则utf8mb4\u unicode\u 520\u ci
。(管道中有更新版本的Unicode排序规则。)

utf8mb4
utf8
的超集,它处理表情符号和一些中文字符所需的4字节utf8代码

在MySQL之外,“UTF-8”指的是所有大小的编码,因此实际上与MySQL的
utf8mb4
相同,而不是
utf8

下面我将尝试使用这些拼写和大写来区分MySQL内部和外部

您应该做什么的概述

  • 将编辑器等设置为UTF-8
  • HTML表单应该像
    一样开始
  • 将字节编码为UTF-8
  • 将UTF-8设置为客户端使用的编码
  • 将列/表声明为
    字符集utf8mb4
    (检查
    显示创建表
  • HTML开头的
  • 存储例程获取当前字符集/排序规则。他们可能需要重建

(及其以下各节)

测试数据

无法信任使用工具或
选择查看数据。
太多这样的客户端,尤其是浏览器,试图补偿错误的编码,并显示正确的文本,即使数据库被破坏。
因此,选择一个包含一些非英语文本的表和列,然后执行以下操作

SELECT col, HEX(col) FROM tbl WHERE ...
正确存储的UTF-8的十六进制将为

  • 对于空格(任何语言):
    20
  • 英文版:
    4x
    5x
    6x
    ,或
    7x
  • 对于大多数西欧国家,重音字母应该是
    Cxyy
  • 西里尔语、希伯来语和波斯语/阿拉伯语:
    Dxyy
  • 亚洲大部分地区:
    exyyz
  • 表情符号和一些中文:
    f0yyzww
出现问题的具体原因和解决方法

截断的文本(
Se
用于
Señor
):

  • 要存储的字节未编码为utf8mb4。解决这个问题
  • 此外,检查读取期间的连接是否为UTF-8
带问号(
Se)的黑钻石�或
表示
Señ或
); 其中一种情况是:

案例1(原始字节不是UTF-8):

  • 要存储的字节未编码为utf8。解决这个问题
  • 插入
    选择
    的连接(或
    设置名称
    )不是utf8/utf8mb4。解决这个问题
  • 另外,检查数据库中的列是否为字符集utf8(或utf8mb4)
案例2(原始字节为UTF-8):

  • 选择
    的连接(或
    设置名称
    )不是utf8/utf8mb4。解决这个问题
  • 另外,检查数据库中的列是否为字符集utf8(或utf8mb4)
只有当浏览器设置为
时,才会出现黑钻石

问号(普通的,不是黑钻石)(
Se?或
Señ或
):

  • 要存储的字节未编码为utf8/utf8mb4。解决这个问题
  • 数据库中的列不是字符集utf8(或utf8mb4)。解决这个问题。(使用
    显示创建表
  • 此外,检查读取期间的连接是否为UTF-8
Mojibake
Señor
用于
Señor
): (此讨论也适用于不一定可见的双重编码。)

  • 要存储的字节需要UTF-8编码。解决这个问题
  • 插入和选择文本时的连接需要指定utf8或utf8mb4。解决这个问题
  • 该列需要声明为字符集utf8(或utf8mb4)。解决这个问题
  • HTML应该以
    开头
如果数据看起来正确,但排序不正确,则 要么你选择了错误的排序规则, 或者没有适合您需要的排序规则, 或者您有双重编码

双重编码可以通过执行
选择来确认。。十六进制..
如上所述

é should come back C3A9, but instead shows C383C2A9
The Emoji Funny how you answer your own question :)

  1. Set your code IDE language to UTF8

  2. Add to your webpage header where you collect data form.

  3. Check your MySQL table definition looks like this:

    CREATE TABLE your_table (
      ...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    é应该返回C3A9,但显示的是C383C2A9
    
    你回答自己问题的表情很有趣:)

  4. 将代码IDE语言设置为UTF8

  5. 添加到您收集数据表单的网页标题

  6. 检查MySQL表定义,如下所示:

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8'); 
    $dbL = new PDO($pdo, $user, $pass, $options);
    
  7. 如果您正在使用PDO,请确保

    mysqli_set_charset($con,"utf8");
    

  8. 如果您已经有一个有上述问题的大型数据库,您可以尝试使用正确的字符集导出SIDU,然后使用UTF8重新导入。祝您好运

    根据服务器的设置,您必须更改编码