簡體   English   中英

在UTF-8中將字符串保存到MySQL時遇到問題

[英]Having trouble saving strings to MySQL in UTF-8

我在編碼某些文件時遇到麻煩。 在我的PHP程序中,我得到一個txt文件。 使用foreach並從該文件獲取每一行並做一個表,接下來我嘗試將這些數據放入我的數據庫,並且在插入后我在數據庫中沒有波蘭字母。 我的數據庫,表和所有字段都有utf8_unicode_ci,當我使用phpmyadmin進行插入時,所有字母均正常。 我嘗試使用detect_encoding($ row),它檢測ASCII解碼。 如何在數據庫中插入波蘭語字母? 請幫忙。

我的數據庫連接:

try{
  $dbh = new PDO('mysql:dbname=google;host=localhost;','root','');  
  $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
  $dbh -> query ('SET NAMES utf8');
  $dbh -> query ('SET CHARACTER_SET utf8_unicode_ci');}

我嘗試

$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));

$url = Encoding::toUTF8($url);

還有ofc iconv還有其他想法嗎?

我插入的所有內容都可以,它是一個示例:

PDOStatement Object ( [queryString] => insert into `site` values ("","meblegdańsk.pl","1") ) 

您的mysql查詢錯誤。 它是SET CHARACTER SET utf8_unicode_ci (請注意空格,而不是SETCHARACTER之間的下划線。這可能是引起問題的最可能原因。

在某些奇怪的MySQL配置上,您可能需要設置其他與字符編碼有關的內容(但通常不要這樣做,不要不必要地弄亂這些內容): http : //dev.mysql.com/doc/refman/5.0/zh /charset-connection.html

順便說一句,這將無法mb_detect_order工作(除非您首先使用了mb_detect_order ):

$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));

如果要將latin2字符轉換為utf-8,但如果它們已經是utf-8,則不要理會它們,您應該這樣做:

$url = mb_convert_encoding($url, 'UTF-8',array ('UTF-8', 'ISO-8859-2'));
// or
mb_detect_order(array ('UTF-8', 'ISO-8859-2'));
$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));

抱歉,如果您以前已經使用過mb_detect_order() 給其他人的注釋:應該用可能期望使用的其他編碼代替ISO-8859-2,這可能取決於您使用的語言。在大多數西歐國家/地區,ISO-8859-1是通常使用的1-字節字符編碼。

無論如何,這允許檢查給定的字符串是否為有效的UTF-8(因此不會對其進行更改),或者是否為無效的UTF-8,則假定它為ISO-8859-2並進行轉換。 該順序很重要,因為每個字符串都是有效的ISO-8859-2,並且您將永遠無法“回退”到UTF-8。 我當時還假設當您說ASCII時,您的意思是ISO-8859-2(它們不是同一回事)。

另外,為了使答案完整,我還想提醒您,您應該確保表中的每一列也都設置為使用utf8編碼。

我懷疑mb_detect_encoding()無法按照您的方式工作:

字符串mb_detect_encoding(字符串$ str [,混合$ encoding_list = mb_detect_order() [,bool $ strict = false]])

如果省略第二個參數,則通常在兩種編碼之間進行選擇

Array
(
    [0] => ASCII
    [1] => UTF-8
)

最后,您要詢問波蘭語文字是ASCII還是UTF-8,然后將結果轉換為UTF-8。 問題在於:

  • ASCII是UTF-8的子集。 從ASCII轉換為UTF-8絕對不會改變您的輸入數據。
  • ASCII無法編碼波蘭語字符。

很難說為什么在沒有示例數據的情況下將ASCII作為輸出獲得-如果文本顯然不是UTF-8,PHP可能默認為ASCII,但是將嚴格的編碼檢測標志設置為false會無濟於事。

我建議您重新考慮為什么首先需要檢測編碼。 如果應用程序不需要輸入文件采用特定的編碼,並且無法更改此要求,則建議您編譯波蘭語文本中的典型編碼列表,並使用mb_detect_encoding()進行輸入。

順便說一句,設置連接編碼的推薦方法是DSN中的charset參數:

$dbh = new PDO('mysql:dbname=google;host=localhost;charset=utf8','root','');  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM