我在MySQL数据库中显示俄罗斯数据时遇到了一些问题。背景:其他一些程序员创建了数据库,我现在负责。
我的问题: 在HTML页面上输出我的数据库中的语句列表。这些陈述都是俄罗斯人。在所有80个语句中,有6个语句在其末尾输出带有白色问号的黑色图标( )。
常见的事情(!!!)是问号始终出现在语句的末尾,语句是最长的,大约有80个字符。 < / p>
以下是我的HTML页面上的一些语句列表:
- Ядействуюскорееактивно,агрессивнои,думаяосвоейвыгоде
- Какинтровертныйсвоенравныйчеловек,которыйдемонстрируетмалособственнойин
- Являешьсяубедительным,располагающимицелеустремленным
- Ядемонстрируюразумиясность,объективностьилогику
- Кого-то,ктосамостоятельномыслитизнает,каксебепомочь
- ТоТносыедовалобысдержаннореагироватьинайтидругойпуть,чтобыполучитьбол
我查看了数据库到我的表“语句”中,发现这些语句被保存为无法识别的字符。例如,上面第二个俄语声明的保存条目(最后包含问号符号)如下:
ЯÐ'ÐμйÑÑ,вуюÑкоÑμμμÐÐÐÐÐÐÐÐ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ оказÑ<ваюÑвÐÐÐÐÐÐÐÐÐÐÐ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ коÑ,ор<ÐμÐÐÐÐÐÐÐ
关于表格:其排序规则为 utf8_unicode_ci ,其中 VARCHAR(150)的字段为数据类型。
我的问题:
修改
在同一个项目中,我发现了另一个问题,我在另一篇文章中描述过。也许这个问题与它有关?
答案 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()
,十六进制Ð
)的一半结尾。
D0
-“替换字符”)抱怨着utf8字符。这要砍到150个字节。EFBFBD
进入MySQL时,第150个字节(十六进制INSERT
已被3个字节(D0
)取代,并以此方式存储在表中。EFBFBD
以“证明”该表。也就是说,MySQL不会 not 截断为150个 bytes 。SELECT LENGTH(col), hex(col) ...
忠实地获取了所存储的内容。因此,请查看文本之前到达MySQL SELECT
所采用的路径。
(多年来我一直在解决字符集问题;我以为我已经看到了一切。对我来说这是一个新的东西!)