資料庫raw類型如何存儲漢字
漢字在存入資料庫之前一定要確認編碼是正確的,我常用的方法是
1、提交之前對漢字做個URLencode,
2、$_POST到漢字時,再做個URLDecode
3、轉為相應的編碼(我資料庫用的是UTF8),比如從GBK轉為UTF8
有人告訴我第三步不用執行,但我沒驗證過。
『貳』 漢字在資料庫中是以二進制形式儲存的嗎是如何轉換的呢
二進制乃數字也,即0、1是也~任何中文、英文、阿拉伯文、韓文……均是以字元形式存儲的!你的中文操作系統裡面有一個東東叫做字型檔,就是存儲的文字,每個中文佔2個字元,每個英文佔1個字元數字和字元是不一樣滴~你打字的時候有各種字體,每種字體都對應一個字型檔,假如漢字有2W個,宋體字型檔就有2W個漢字,楷體字型檔也有2W漢字,幼圓、黑體等等類推!
『叄』 在mysql資料庫里,如何建表 才可以存儲漢字我用的varchar類型,報1366錯誤,使用text也同樣報錯。
不是類型的問題
是編碼不對
把表的那行
Collation
設置成gbk_chinese_ci就OK了
試試用mysql的圖形界面軟體
直觀一些
『肆』 mysql中要存儲漢字要將數據類型定義為什麼
設置為gbk即可.可以寫一個my.ini來自動設置:
在Windows的系統安裝目錄下 (如:C:\WINDOWS\my.ini) 新建一個「my.ini」文件,注意後綴名是「ini」。內容如下:
[WinMySQLAdmin]
Server=c:/apps/mysql/bin/mysqld-nt.exe
[mysqld]
basedir=c:/apps/mysql
datadir=c:/dev/mysql data/data
default-character-set=gbk
[client]
default-character-set=gbk
上面「Server」指向MySQL的執行主程序,「basedir」指向MySQL的安裝目錄,「datadir」指向MySQL的數據存放目錄(因為我改變了它,所以需要特別指定),設置」default-charseter-set=gbk」是為了支持默認為中文。然後把「c:\apps\mysql\bin」追加到「環境變數」的「path」變數中 。
『伍』 mysql 資料庫表中不能存儲漢字
設計表 將字元集 該為 utf8
『陸』 Oracle資料庫中什麼欄位類型能保存'0'字元
目前Oracle 資料庫大概有26個欄位類型,大體分為六類,分別是字元串類型、數字數據類型、日期時間數據類型、大型對象(LOB)數據類型、RAW和LONG RAW數據類型、ROWID和UROWID數據類型。當然Oracle還提供用戶自定義的數據類型,但在我這篇不做討論。
字元串類型
Char
char數據類型存儲固定長度的字元值。一個CHAR數據類型可以包括1到2000個字元。如果對CHAR沒有明確地說明長度,它的默認長度則設置為1。 如果對某個CHAR類型變數賦值,其長度小於規定的長度,那麼Oracle自動用空格填充。
注意:如果給了一個比固定長度更長的值,其尾部帶有空格,則空格會被刪除到固定的長度。如果值太大Oracle會返回一個錯誤,
Varchar
用於保存變長的字元串數據。其中最大位元組長度由(size)指定。每行長度可變,最大長度為每行4000位元組。設置長度(size)前需考慮字元集為單位元組或多位元組。
注意:varchar是被廢棄的類型,oracle目前都推薦使用varchar2。雖然varchar也可以用,但不確保未來的版本是否還支持
Varchar2
用於保存變長的字元串數據。其中最大位元組長度由(size)指定。每行長度可變,最大長度為每行4000位元組。設置長度(size)前需考慮字元集為單位元組或多位元組。由於VARCHAR2數據類型只存儲為該列所賦的字元(不加空格),所以VARCHAR2需要的存儲空間比CHAR數據類型要小。
區別:varchar2把所有字元都占兩位元組處理(一般情況下),varchar只對漢字和全形等字元占兩位元組,數字,英文字元等都是一個位元組;VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;大部分情況下建議使用varchar2類型,可以保證更好的兼容性。
Nchar
Unicode數據類型,根據字元集而定的固定長度字元串,最大長度2000bytes。
Nvarchar2
Unicode數據類型,根據字元集而定的可變長度字元串,最大長度4000bytes。
Long
可變長字元列,最大長度限制為2GB,用於不需要作字元串搜索的長串數據。
說明:此類型是一個遺留下來的而且將來不會被支持的數據類型,逐漸被BLOB,CLOB,NCLOB等大的數據類型所取代。
數字類型
Number
NUMBER數據類型精度可以高達38位,它有兩個限定符,如:column NUMBER(precision,scale)。precision表示數字中的有效位。如果沒有指定precision的話,Oracle將使用38 作為精度。scale表示小數點右邊的位數,scale默認設置為0。如果把scale設成負數,Oracle將把該數字取捨到小數點左邊的指定位數。
Decimal
Oracle只是在語法上支持decimal類型,但是在底層實際上它就是number類型,支持decimal類型是為了能把數據從Oracle資料庫移到其他資料庫中。
Float
FLOAT類型也是NUMBER的子類型。其格式Float(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從1 到 126。若要從二進制轉換為十進制的精度,請將n 乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
BINARY_FLOAT
BINARY_FLOAT 是一種 32 位,單精度浮點數字數據類型。每個 BINARY_FLOAT 值需要5 位元組存儲空間,其中 1位元組用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但採用二進制精度,而NUMBER 採用十進制精度。因此能夠提供更快的數學運算速度,且能減少佔用的存儲空間。
BINARY_DOUBLE
BINARY_DOUBLE 是一種 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 值需要9 位元組存儲空間,其中1 位元組用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但採用二進制精度,而NUMBER 採用十進制精度。因此能夠提供更快的數學運算速度,且能減少佔用的存儲空間。
日期數據類型
Date
ORACLE最常用的日期類型,它可以保存日期和時間,常用日期處理都可以採用這種類型。DATE表示的日期范圍可以是公元前4712年1月1日至公元9999年12月31日。
date類型在資料庫中的存儲固定為7個位元組, 第1位元組:世紀+100、 第2位元組:年、第3位元組:月、第4位元組:天、第5位元組:小時+1、第6位元組:分+1、第7位元組:秒+1。
Timestamp
ORACLE常用的日期類型,它與date的區別是不僅可以保存日期和時間,還能保存小數秒,小數位數可以指定為0-9,默認為6位,所以最高精度 可以到ns(納秒),資料庫內部用7或者11個位元組存儲,如果精度為0,則用7位元組存儲,與date類型功能相同,如果精度大於0則用11位元組存儲。第1位元組:世紀+100、第2位元組:年、第3位元組:月、第4位元組:天、 第5位元組:小時+1、第6位元組:分+1、第7位元組:秒+1、 第8-11位元組:納秒,採用4個位元組存儲,內部運算類型為整形
註:TIMESTAMP日期類型如果與數值進行加減運算會自動轉換為DATE型,也就是說小數秒會自動去除。
TIMESTAMP WITH TIME ZONE
對TIMESTAMP進行了擴展,用於存儲時區。時間戳以及時區位移值,其中fractional_seconds_precision是數字在第二日期時間欄位的小數部分數字的所有值。可接受的值是0到9。默認是6。默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。大小固定為13位元組。此數據類型包含日期時間欄位YEAR,MONTH,日,小時,分鍾,秒TIMEZONE_HOUR和TIMEZONE_MINUTE。它有一個明確的分數秒和時區。
TIMESTAMP WITH LOCAL TIME ZONE
所有的TIMESTAMP WITH TIME ZONE值,但下列情況除外:數據標准化資料庫的時區時,存儲在資料庫中。當數據被檢索,用戶可以看到在會話時區中的數據。
默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。的大小不同的7至11個位元組,取決於精度。
INTERVAL YEAR TO MONTH
存儲期間年數和月的時間,其中year_precision是數字的年份日期時間欄位的數量。可接受的值是0到9。默認是2。大小固定為5個位元組。
INTERVAL DAY TO SECOND
其格式為:INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)],是存儲一段時間以天,小時,分鍾和秒,其中day_precision是數字在DAY日期時間欄位的最大數量。可接受的值是0到9。默認是2。fractional_seconds_precision是數字中的第二個欄位的小數部分的數量。可接受的值是0到9。默認是6。大小固定為11個位元組。
INTERVAL YEAR TO MONTH
Oracle語法:INTERVAL YEAR [(year_precision )] TO MONTH,用來表示一段時間差, 只精確到年和月. year_precision是數字年的時間段,接受的值為0到9。默認值是2。大小固定為5個位元組。
大型對象(LOB)數據類型
Clob
最大4G,存儲單位元組字元型數據。適用於存儲超長文本。
Nclob
最大4G,存儲多位元組國家字元型數據。適用於存儲超長文本。
Blob
最大4G,存儲二進制數據。適用於存儲圖像、視頻、音頻等。
BFile
最大長度是4GB,在資料庫外部保存的大型二進制對象文件,最大長度是4GB。這種外部的LOB類型,通過資料庫記錄變化情況,但是數據的具體保存是在資料庫外部進行的。 Oracle 可以讀取、查詢BFILE,但是不能寫入,不參與事務。
RAW和LONG RAW數據類型
RAW
raw(n)格式,其中n=1 to 2000,可變長二進制數據,在具體定義欄位的時候必須指明最大長度n,Oracle 用這種格式來保存較小的圖形文件或帶格式的文本文件,如Miceosoft Word文檔。raw是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
LONG RAW
最大長度是2GB。可變長二進制數據,最大長度是2GB。Oracle 用這種格式來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件。在同一張表中不能同時有long類型和long raw類型,long raw也是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
ROWID和UROWID數據類型
Rowid
ROWID為該錶行的唯一標識,是一個偽列,可以用在SELECT中,但不可以用INSERT, UPDATE來修改該值。ROWID列,Oracle使用ROWID列來建立內部索引。你可以引用ROWID的值,但ROWID並不存放在資料庫中,你可以創建一個表包含ROWID數據類型。但Oracle不保證該值是合法的rowids。用戶必須確保該rowid值是真實合法的。
Urowid
UROWID支持邏輯和物理的rowids,列UROWID類型可以存儲各種rowids, 從8.1以後的Oracle才有UROWID類型,它也可以用來保存以前的ROWID類型數據信息。
特殊數據類型
Xmltype
XMLType是Oracle從9i開始特有的數據類型,是一個繼承了Blob的強大存在,可以用來存儲xml並提供了相當多的操作函數,用來直接讀取xml文檔和管理節點。理論上可以保存2G大小的數據。作為XML數據的特殊存儲類型。Xmltype提供了適合的保存、檢索和操作的支持。
Xmlindex
XMLIndex 索引可用於 SQL/XML 函數 XMLExists()、XMLTable() 和 XMLQuery(),而且它在查詢的任何部分都有效;它並不限於用在 WHERE 子句中。而您可能用於 XML 數據的其他任何索引都無法做到這一點。
XMLIndex 因此可提高對 SELECT 列表數據和 FROM 列表數據的訪問速度,對 XML 片段提取尤為有用。基於函數的索引和 CTXXPath 索引。您無需預先了解將在查詢中使用的XPath 表達式。XMLIndex 完全是通用的,而基於函數的索引則不同。可將 XMLIndex 索引用於基於 XML 模式或非基於模式的數據。它可用於二進制 XML 和非結構化存儲模型。B 樹索引僅適用於以對象關系方式存儲(結構化存儲)的基於模式的數據;它對於存儲在二進制XML 或CLOB 實例中的基於 XML 模式的數據效率低下。可使用 XMLIndex 索引通過 XPath 表達式進行搜索,這些表達式的目標是集合(即文檔中出現多次的節點)。而函數索引則不然。
『柒』 mssql或mysql資料庫中怎麼存儲大段文字呢(1000個中文字元以上)
朋友,據我所知varchar欄位類型已經夠用了,char類型其長度是固定的,在創建表時就指定了,
但是varchar類型的長度是可變的,在建表的時候就制定了最大長度,其最大值可以取:0~65535之間的任意值(長度可以再0到最大值之間) 而且在這個最大范圍內,使用多少則分配多大的空間,例如varchar(100),並不是每條記錄都要佔用100個位元組哦!! 最後強調:varchar類型實際佔用的空間為字元串的實際長度加1 如varchar(10):欄位 『123』,他占的內存位元組是4(3+1),而char(10)則佔用了10個位元組。 全手工,希望朋友採納
對於大篇幅的文本欄位,一般推薦用text和blob數據類型定義欄位, 有時候不必在於一點空間的消耗,只要我們在資料庫優化做好就夠了
『捌』 資料庫中對於存儲漢字和各種符號的欄位應該定義為什麼類型
需要定義成字元型,一般可用char、varchar、nchar、nvarchar等,具體需要看實際需求。
這幾種類型的比較:
CHAR
CHAR存儲定長數據很方便,CHAR欄位上的索引效率級高,比如定義char(10),那麼不論你存儲的數據是否達到了10個位元組,都要佔去10個位元組的空間。
VARCHAR
存儲變長數據,但存儲效率沒有CHAR高,如果一個欄位可能的值是不固定長度的,我們只知道它不可能超過10個字元,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什麼"+1"呢?這一個位元組用於保存實際使用了多大的長度。
從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
NCHAR、NVARCHAR
這兩種從名字上看比前面三種多了個"N"。和char、varchar比較起來,nchar、nvarchar最多存儲4000個字元,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。可以看出使用nchar、nvarchar數據類型時不用擔心輸入的字元是英文還是漢字,較為方便,但在存儲英文時數量上有些損失。
所以一般來說,如果含有中文字元,用nchar/nvarchar,如果純英文和數字,用char/varchar
『玖』 資料庫中varchar、nvarchar、char存儲字元、數字、漢字的容量區別是什麼
char:固定長度,例如:char(6),你輸入的字元小於6時,它會在後面補空值。當你輸入的字元大於指定的數時,它會截取超出的字元。
存儲字元:ANSI
數字英文存儲:最多能存儲8000個。
漢字存儲:4000個漢字
-----------------------------分割---------------------------
varchar(n):可變長度,(n為某一整數,不同資料庫,最大長度n不同)
存儲字元:ANSI
n 必須是一個介於 1 和 8,000 之間的數值。存儲大小為輸入數據的位元組的實際長度,而不是 n 個位元組。所輸入的數據字元長度可以為零。
數字英文存儲:最多能存儲8000個。
漢字存儲:4000個漢字
-----------------------------分割-----------------------------
nvarchar:可變長度,
存儲字元:Unicode
Unicode所有的字元(漢字和英文)都用兩個位元組表示。
數字英文存儲:最多能存儲4000個。
漢字存儲:4000個漢字
一般來說如果含有中文字元,用nvarchar,如果純英文和數字,用char/varchar。
『拾』 sql里數據類型nchar(10)為什麼能存10個漢字, char(10)只能存5個漢字
這個得看你字元是按照什麼樣的編碼規則
1、如果是單位元組編碼,舉個例子ASCII,一個字元(准確來說是英文字元)是用一個位元組編碼的,而按照ASCII的拓展編碼(具體是哪個編碼規則忘了,不過可以統稱ANSI),一個漢字是用兩個字元表示,所以在此編碼規則下,存放一個漢字(兩個字元)需要兩個位元組,而char(10)中的10指的是字元個數,而不是多少位元組(雖然在這種編碼下得到的結果一樣,因為一個字元對應一個位元組,但是對於雙位元組編碼的不是這樣理解的),所以char(10)可以存10個字元,兩個個字元表示一個漢字,所以最多存5個漢字。
2、如果是雙位元組編碼,一個字元(這里的字元不僅僅包括英文字元,還包括中文字元即漢字,以及其他的字元)是用兩個位元組編碼的,nchar()存儲的是UNICODE字元,它是採用雙位元組編碼規則,即一個字元相當於兩個位元組,但是nchar(10)其實不需要考慮到位元組問題,這個10指的就是字元個數,在此規則下漢字和英文字元一樣的性質,所以nchar(10)就能存10個漢字。
總結:發生這樣的疑惑主要是,單位元組編碼沒有把漢字等同於一般的字元例如英文字元,而是採用兩個一般的字元來表示一個漢字,而雙位元組編碼一視同仁,說到字元就是指所有字元,包括漢字。