俄语中的一些SQL数据最后用符号 输出

时间:2016-01-23 08:17:39

标签: php mysql database

我在MySQL数据库中显示俄罗斯数据时遇到了一些问题。背景:其他一些程序员创建了数据库,我现在负责。

我的问题: 在HTML页面上输出我的数据库中的语句列表。这些陈述都是俄罗斯人。在所有80个语句中,有6个语句在其末尾输出带有白色问号的黑色图标( )。

常见的事情(!!!)是问号始终出现在语句的末尾,语句是最长的,大约有80个字符。 < / p>

以下是我的HTML页面上的一些语句列表:

  
      
  • Ядействуюскорееактивно,агрессивнои,думаяосвоейвыгоде
  •   
  • Какинтровертныйсвоенравныйчеловек,которыйдемонстрируетмалособственнойин
  •   
  • Являешьсяубедительным,располагающимицелеустремленным
  •   
  • Ядемонстрируюразумиясность,объективностьилогику
  •   
  • Кого-то,ктосамостоятельномыслитизнает,каксебепомочь
  •   
  • ТоТносыедовалобысдержаннореагироватьинайтидругойпуть,чтобыполучитьбол
  •   

我查看了数据库到我的表“语句”中,发现这些语句被保存为无法识别的字符。例如,上面第二个俄语声明的保存条目(最后包含问号符号)如下:

  

ЯÐ'ÐμйÑÑ,вуюÑкоÑμμμÐÐÐÐÐÐÐÐ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   Ð¾ÐºÐ°Ð·Ñ<ваюÑвÐÐÐÐÐÐÐÐÐÐÐ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   ÐºÐ¾Ñ,ор<ÐμÐÐÐÐÐÐÐ

关于表格:其排序规则为 utf8_unicode_ci ,其中 VARCHAR(150)的字段为数据类型。

我的问题:

  1. 为什么语句会在我的表格中保存这些无法识别的字母?我怎样才能将它们转换成俄语?
  2. html输出中问号符号的原因是什么?我怎么能摆脱它?
  3. 修改

    在同一个项目中,我发现了另一个问题,我在另一篇文章中描述过。也许这个问题与它有关?

    PHP: Special char becomes question mark icon in substring

4 个答案:

答案 0 :(得分:1)

在插入时使用'SET names=utf8'查询,问题是,在输入(插入)时,数据被转换为一些特殊字符。

所以如果你使用这个,用俄语输入的数据,相同的数据也会被添加到数据库中。 在检索时,您将获得与输入相同的结果。

答案 1 :(得分:0)

使用mbstring可以改变编码 http://php.net/manual/en/book.mbstring.php

答案 2 :(得分:0)

这听起来像是一个简单的截断问题。 Varchar(150)表示字段最大为150 字节。 UTF8每个符号可以使用多个字节 - 例如,西里尔字母中的每个字母将使用2个字节,而空格或逗号符号将使用1个字节。因此,如果字符串长度超过150个字节,那么西里尔字母可能会在中间被截断。例如,在您的第二句中,小и包含utf8代码d0 b8,但被截断为d0,这是不可打印的符号,导致您看到?。你无能为力,数据已经丢失。您只能通过从字符串末尾移除C2..DF范围内的独立字节来美化显示。

至于你看到的不明信件,有很多因素。数据库编码,连接编码,表格排序和显示编码如果您使用的是Web界面都会造成混乱,在您看到之前可能会对字符串进行多次重新编码。也有可能在插入之前以某种方式重新编码数据并在显示之前解码 - 这不是我在遗留代码中看到的最糟糕的事情。你必须自己试验并找到合适的组合。

答案 3 :(得分:0)

不。我认为其他内容会被截断为150个字节。然后MySQL出现了一个无效的utf8字符串,以西里尔字符(import numpy as np from dataclasses import dataclass import typing # Definitions: @dataclass(order=True) class Theta: vector: np.ndarray def a(self) -> typing.AnyStr: return self.vector.size def b(self) -> str: return self.vector.size # Client code: x = np.array([1, 2]) s = Theta(x).a().capitalize() # runtime errors u = Theta(x).b().capitalize() ,十六进制Ð)的一半结尾。

  1. 上一个过程通过将utf8字符变成黑色菱形(十六进制D0-“替换字符”)抱怨着utf8字符。这要砍到150个字节
  2. EFBFBD进入MySQL时,第150个字节(十六进制INSERT已被3个字节(D0)取代,并以此方式存储在表中。
  3. 请注意,表中有 152 个字节-请参见EFBFBD以“证明”该表。也就是说,MySQL不会 not 截断为150个 bytes
  4. SELECT LENGTH(col), hex(col) ...忠实地获取了所存储的内容。
  5. 您显示了这样的内容。

因此,请查看文本之前到达MySQL SELECT所采用的路径。

(多年来我一直在解决字符集问题;我以为我已经看到了一切。对我来说这是一个新的东西!)