我读过NVARCHAR类型,但在我的免费托管服务器的phpmyadmin窗口中没有任何名为NVARCHAR的类型。 (000webhost.com)
我可以手动插入像字符串“തിരുവനന്തപുരം∙മൂന്നുവർഷങ്ങൾക്കുമുൻപ്മൊയ്തീന്റെകഥയുടെവൺലൈൻകേട്ടപ്പൊഴേഎന്ന്നിന്റെമൊയ്തീൻസിനിമചെയ്യാൻതീരുമാനിച്ചിരുന്നു”到数据库中的行,但是当我使用的PHP做同样的插入的数据变得像
ന്യൂഡൽഹി∙ ഇന്ത്യ
我现在正在使用排序规则utf8_unicode_ci并输入VARCHAR(1000)。
我的PHP代码
header('Content-Type: text/html; charset=utf-8');
$con = new mysqli("mysql1.000webhost.com", "a9798817_person",
"starting1", "a9798817_person");
$con->set_charset('utf8');
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
if (!empty($_FILES["image2"]["name"])&&!empty($_FILES["image3"]["name"]))
{
echo"first second and third image with content is uploaded";
$file_name1=$_FILES["image1"]["name"];
$target_path1 = "images/".$file_name1;
$temp_name1=$_FILES["image1"]["tmp_name"];
$file_name2=$_FILES["image2"]["name"];
$target_path2 = "images/".$file_name2;
$temp_name2=$_FILES["image2"]["tmp_name"];
$file_name3=$_FILES["image3"]["name"];
$target_path3 = "images/".$file_name3;
$temp_name3=$_FILES["image3"]["tmp_name"];
$content="തിരുവനന്തപുരം∙ മൂന്നു വർഷങ്ങൾക്കു മുൻപ് മൊയ്തീന്റെ കഥയുടെ വൺലൈൻ കേട്ടപ്പൊഴേ എന്ന് നിന്റെ മൊയ്തീൻ സിനിമ ചെയ്യാൻ തീരുമാനിച്ചിരുന്നു "
print($content);
if(move_uploaded_file($temp_name1, $target_path1)&&move_uploaded_file($temp_name2, $target_path2)&&move_uploaded_file($temp_name3, $target_path3))
{
$query_upload="INSERT INTO MAINNEWS (image1,image2,image3,content) VALUES ('$file_name1','$file_name2','$file_name3','$content')";
$con->query($query_upload) or die("error in $query_upload == ----> ".mysql_error());
}
else
{
exit("Error While uploading image on the server");
}
}
我的输出为
first second and third image with content is uploadedതിരുവനന്തപുരം∙ മൂന്നു വർഷങ്ങൾക്കു മുൻപ് മൊയ്തീന്റെ കഥയുടെ വൺലൈൻ കേട്ടപ്പൊഴേ എന്ന് നിന്റെ മൊയ്തീൻ സിനിമ ചെയ്യാൻ തീരുമാനിച്ചിരുന്നു
但在数据库中,内容字段显示为
ന്യൂഡൽഹി∙等
注意:实际上在数字和';'之间没有任何空格,我特意把它显示在它的显示器上,一般都喜欢യൂഡൽഹ<
答案 0 :(得分:1)
本说明包含一些介绍性说明。
某些品牌和型号的rdbms表服务器使用NVARCHAR()
数据类型来存储unicode数据。 Unicode是存储多语言数据的好方法,例如,僧伽罗语(正确吗?)和英语。
但MySQL 没有NVARCHAR()
数据类型。相反,您可以在表中创建列时指定用于存储内容的字符集。 UTF8字符集对此有好处。您还可以指定排序规则(例如utf8_general_ci
或utf8_sinhala_ci
。这些排序规则对数据的存储方式无效,仅限于排序和过滤方式。
MySQL(与表服务器的所有品牌和型号一样)是客户端 - 服务器系统。服务器保存数据并满足查询。您必须使用客户端从服务器插入或检索数据。客户端在进入的路上处理您的数据,并在出路时再次处理。
你的问题是你&#34;手动插入&#34;一些数据进入服务器。准确地说,这是完全不可能的。你必须使用一些客户端软件,即使它是mysql命令行程序。要解决您的问题,您需要弄清楚您用于所谓的&#34;手册&#34;操作。为什么?因为客户端软件处理您的数据。
名为phpMyadmin
的程序是其中一个客户端程序。不幸的是,很难用于解决您的问题。为什么?它使用Web浏览器呈现其输出。世界包含许多表示多语言字符的方式。 Web浏览器是为信息用户构建的。他们会尽力猜测用户希望看到的内容。
特别是,Web浏览器接受编码为HTML实体的字符,并为查看器翻译它们。例如,<&>
呈现为&lt;&amp;&gt; 。而且,您的数据字符串
ന്യൂഡൽഹി∙
呈现为ന്യൂഡൽഹി∙。
(构建Stack Overflow的人遇到了很多麻烦,以确保我们可以显示这些文字html实体。)
大多数Unicode字符可以表示为16位项,例如十六进制3368表示ന。它们也可以表示为这些html实体:前缀为&#
的十六进制数,后跟分号。在浏览器中(即在phpmyadmin中),除非您使用View Source,否则您将无法区分...
这个html实体的东西允许所有类型的信息表示为7位(ASCII,与旧式电传打字机兼容)字符的流。它对数据交换很方便。但它并不适用于MySQL排序规则。
所以,这就是事情。数据库中的信息似乎已经以html实体形式(ന
)编码,而不是以僧伽罗语的unicode编码。你的任务是弄清楚发生了什么。
PHP程序可以使用htmlentities()
将utf文本转换为授权文本。其他语言具有类似的功能。很明显,用于将数据放入MySQL的软件就是这样做的。
一旦您从MySQL中检索到文本,该文本可以通过html_decode()
转换回unicode。
你如何弄清楚MySQL中存储的是什么?试试这个:
SELECT col, CHARACTER_LENGTH(col), HEX(col)
这将显示您的客户提供的col
的价值。它还将显示列中的字符数和col的十六进制编码。授权字符中的字符数为6,而unicode字符中的字符数为1。