如何将多语言字符串插入数据库?

时间:2015-09-26 12:14:38

标签: php android mysql sql character-encoding

我读过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തിരുവനന്തപുരം∙ മൂന്നു വർഷങ്ങൾക്കു മുൻപ് മൊയ്തീന്റെ കഥയുടെ വൺലൈൻ കേട്ടപ്പൊഴേ എന്ന് നിന്റെ മൊയ്തീൻ സിനിമ ചെയ്യാൻ തീരുമാനിച്ചിരുന്നു 

但在数据库中,内容字段显示为

ന്യൂഡൽഹി∙等

注意:实际上在数字和';'之间没有任何空格,我特意把它显示在它的显示器上,一般都喜欢യൂഡൽഹ<

1 个答案:

答案 0 :(得分:1)

本说明包含一些介绍性说明。

某些品牌和型号的rdbms表服务器使用NVARCHAR()数据类型来存储unicode数据。 Unicode是存储多语言数据的好方法,例如,僧伽罗语(正确吗?)和英语。

但MySQL 没有NVARCHAR()数据类型。相反,您可以在表中创建列时指定用于存储内容的字符集。 UTF8字符集对此有好处。您还可以指定排序规则(例如utf8_general_ciutf8_sinhala_ci。这些排序规则对数据的存储方式无效,仅限于排序和过滤方式。

MySQL(与表服务器的所有品牌和型号一样)是客户端 - 服务器系统。服务器保存数据并满足查询。您必须使用客户端从服务器插入或检索数据。客户端在进入的路上处理您的数据,并在出路时再次处理。

你的问题是你&#34;手动插入&#34;一些数据进入服务器。准确地说,这是完全不可能的。你必须使用一些客户端软件,即使它是mysql命令行程序。要解决您的问题,您需要弄清楚您用于所谓的&#34;手册&#34;操作。为什么?因为客户端软件处理您的数据。

名为phpMyadmin的程序是其中一个客户端程序。不幸的是,很难用于解决您的问题。为什么?它使用Web浏览器呈现其输出。世界包含许多表示多语言字符的方式。 Web浏览器是为信息用户构建的。他们会尽力猜测用户希望看到的内容。

特别是,Web浏览器接受编码为HTML实体的字符,并为查看器翻译它们。例如,&lt;&amp;&gt呈现为&lt;&amp;&gt; 。而且,您的数据字符串

&#3368;&#3405;&#3375;&#3394;&#3361;&#3453;&#3385;&#3391;&#8729;

呈现为ന്യൂഡൽഹി∙

(构建Stack Overflow的人遇到了很多麻烦,以确保我们可以显示这些文字html实体。)

大多数Unicode字符可以表示为16位项,例如十六进制3368表示。它们也可以表示为这些html实体:前缀为&#的十六进制数,后跟分号。在浏览器中(即在phpmyadmin中),除非您使用View Source,否则您将无法区分...

这个html实体的东西允许所有类型的信息表示为7位(ASCII,与旧式电传打字机兼容)字符的流。它对数据交换很方便。但它并不适用于MySQL排序规则。

所以,这就是事情。数据库中的信息似乎已经以html实体形式(&#3368;)编码,而不是以僧伽罗语的unicode编码。你的任务是弄清楚发生了什么。

PHP程序可以使用htmlentities()将utf文本转换为授权文本。其他语言具有类似的功能。很明显,用于将数据放入MySQL的软件就是这样做的。

一旦您从MySQL中检索到文本,该文本可以通过html_decode()转换回unicode。

你如何弄清楚MySQL中存储的是什么?试试这个:

 SELECT col, CHARACTER_LENGTH(col), HEX(col)

这将显示您的客户提供的col的价值。它还将显示列中的字符数和col的十六进制编码。授权字符中的字符数为6,而unicode字符中的字符数为1。