בעיית קידוד עמודה לעברית ב DB sql server

sparty

New member
בעיית קידוד עמודה לעברית ב DB sql server

ברצוני להגדיר עמודה אחת בטבלה שתקבל נתונים בעברית, כאשר שאר העמודות הן בשפות שונות הטבלה כבר ישנה בבסיס הנתונים ראשית האם ניתן להגדיר עמודה אחת בשפה בה אני בוחר , והאים אני יכול לעשות זאת ע"י תיכנות ישיר של העמודה ,או הוספת הגדרה היכן שהוא ( ע"י תכנות או אחרת ) אם כן , היכן מגדירים זאת ? , ובאיזו צורה שנית האם זה קשור ל Extended Propertis תודה
 

sparty

New member
זה מה שעשיתי , פשוט עשיתי כמה אופציות שישנן

אך שום תוצאה לא נראת באופק חפשתי בספרים את הפקודה המלאה ולא מצאתי , עשיתי עבודת " שטח " של שבוע ואין מוצא דוג' לקוד תתקבל בברכה ! העניין הוא שהנתונים מוכנסים דרך טקסטבוקס לפרמטרים ומשם דרך שגרה כמובן עם פרמטרים לעמודת "עברית " <(בתקווה שתהיה) ערך הפרמטר של העמודה הוא nvarchar אותו כנ"ל ההגדרה בשדה העמודה ! הדף עצמו מקודד ב utf-8 .(מציג עברית בדף עצמו) בבסיס הנתונים sql עצמו אין לי גישה להגדרת השרת , מאחר וזוהיא חברת אכסון , לכן בקשתי קוד ולא הגדרה ! מה שכן אולי אנסה ליצור את הטבלה בקידוד utf-8 בשרת שלי ולהעלות לשרת האחסון אם יש למאן דהוא רעיון בהקשר זה אשמח לשמוע !
 

sparty

New member
גרי ,אני מפרט את הבעייה של הקידוד לפרטים

בסיס הנתונים הוא sql הדפים מקודדים utf-8 כל הערכים מוצגים נכון בכל העמודות שהן לא עברית. cillation של העמודה עברית הוא Hebrew_CI_AI בעמודה עצמה של העברית , במידה ואני מכניס ערך עברית ישירות(עריכה של שדה יחיד ) לעמודה , הערך מוצג נכון בעברית ,גם בשליפה. הבעייה היא בעדכון לעמודה.דרך הממשק , רואים את סמני השאלה בעמודה עברית תהליך העדכון טקסטבוקס > פרמטר > קריאה לשגרה ( אולי משהו עם הגדרת הפרמטר ? ) הקוד שמעביר את הפרמטר
cmd.Parameters.Add(new SqlParameter("@param1", SqlDbType.VarChar)); cmd.Parameters["@param1"].Direction = ParameterDirection.Input; cmd.Parameters["@param1"].Value = TextBoxlink1.Text;​
קוד הטבלה
USE [AMPMDB1] GO /****** Object: Table [dbo].[PhotoPage] Script Date: 09/02/2007 09:22:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[PhotoPage]( [ID] [int] IDENTITY(1,1) NOT NULL, [disHE] [varchar](max)COLLATE Hebrew_CS_AI NULL, CONSTRAINT [PK_PhotoPage] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF​
השגרה
USE [AMPMDB1] GO /****** Object: StoredProcedure [dbo].[UPdatePhoto1] Script Date: 09/02/2007 09:00:41 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[UPdatePhoto1] @param1 nvarchar(MAX)) AS INSERT INTO [PhotoPage] (disHE) VALUES ( @param1 )​
כניראה שחסר לי משהו עם הפרמטר עצמו (שמעביר את העברית ), כל העמודות שאינן עברית מעודכנות כמו שצריך חוץ מהעמודה של העברית
 

sparty

New member
גרי תודה , מצאתי את הדרך לפתרון הסוגייה

כתבתי את הפתרון לעיל תודה רבה על העזרה
 

sparty

New member
פתרון לבעיית קידוד עברית כללי+פרמטרים

תודה לגרי רשף על העזרה ! אם ישנם הערות אשמח לשמוע יכול להיות שיש כאן קצת מידע לא קשור לבסיסי נתונים ממש אבל בשביל התמונה הכללית הוספתי אותו כאשר עובדים עם מסד נתונים MSsql =sql server קבצים : asp ; aspx; קבצים HTML שפות :C# ;VB ביחד עם sql CodePage ראשית יש לקודד דף (קידוד הדף זהו הקידוד לשרת הווה אומר באיזו שפה אנחנו מדברים עם השרת,שליחה,הוספה , עדכון ,וכ"ו) הנה כך >
<%@ Page Language="C#" CodePage="65001" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Debug="true" Culture="he-IL" %​
charset שנית יש לקודד את " הדפדפן " (כך שכל מי שפותח את הדף יראה עברית) הנה כך (להוסיף > בהתחלה < בסוף כמובן
meta content="text/html; charset=utf-8 " http-equiv="content-type" /​
עבודה עם פרמטרים - ----- > שימו לב להגדרת סוג SqlDbType.NVarChar קובץ aspx ; asp אנחנו נקרא גם לשגרה בה יש את ההגדרה לעדכון בסיס הנתונים - שם השגרה הוא : UPdatePhoto1
cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "UPdatePhoto1"; cmd.Parameters.Add(new SqlParameter("@param2", SqlDbType.NVarChar)); cmd.Parameters["@param2"].Direction = ParameterDirection.Input; cmd.Parameters["@param2"].Value = TextBoxdisHE1.Text;​
כעת נעבור ליצירת הטבלה עצמה ככלל בכל עבודה עם השפה העברית , נגדיר את כל השדות עם N (מסמן עבודה עם נתונים של unicode) לדוגמה Nvarchar ,Nchat,Ntext וכ"ו שימו לב לשורה > ALTER TABLE PhotoPage ALTER COLUMN disHE NVarChar(max) COLLATE Hebrew_CS_AI שימו לב גם ל >NVarChar(max) וגם ל > Hebrew_CS_AI לכל שרת ישנה ברירת מחדל לאחסון הנתונים , ברירת המחדל היא ברוב המקרים לאנגלית (או סינית אם תרצו .....) ההגדרה היא מסוג collation שמגדירה את סוג "החזקת" הנתונים ,אנחנו יכולים לשנות הגדרה זו ע"י הוספת השורה שלעיל שורה זו כופה הגדרת collation על עמודה בשם disHE להיות מוגדרת לנתונים בעברית אנו משתמשים בפקודה COLLATE לשם כך ! כמו שרואים אפשר להגדיר collation על עמודה אחת , כך שכל עמודה ועמודה "מדברת " בנפרד .
USE [AMPMDB1] GO /****** Object: Table [dbo].[PhotoPage] Script Date: 09/02/2007 09:22:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[PhotoPage]( [ID] [int] IDENTITY(1,1) NOT NULL, [link] [nvarchar](max) NULL, [disHE] [nvarchar](max) NULL, העמודה בעברית בה אנו משנים את הגדת ברירת המחדל [disEN] [nvarchar](max) NULL, [disFR] [nvarchar](max) NULL, CONSTRAINT [PK_PhotoPage] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ALTER TABLE PhotoPage ALTER COLUMN disHE VarChar(max) COLLATE Hebrew_CS_AI GO SET ANSI_PADDING OFF​
כעת נראה את השגרה UPdatePhoto1 לה אנו קוראים שימו לב שסוג הפרמטר בשם @param2 מוגדר כ - Nvarchar
ALTER PROCEDURE [dbo].[UPdatePhoto1] @param1 varchar(MAX),@param2 Nvarchar (max),@param3 varchar(MAX),@param4 varchar(MAX) AS INSERT INTO [PhotoPage] (link ,disHE,disEN ,disFR ) VALUES ( @param1 ,@param2,@param3 ,@param4)​
אם יש הארות והערות אשמח לשמוע
 

גרי רשף

New member
תודה על הסיכום

נחמד שמי שהתמודד עם בעייה ומצא לה פתרון- מעלה את זה כאן למען הדורות הבאים: יום אחד מישהו יעשה חיפוש וימצא את זה. הערה מקצועית- ה-Collation משמעותי לשדות טקסט שאינם Unicode (למשל Char או VarChar). עבור שדות מסוג NVarChar הגדרת ה-Collation חסרת משמעות מעשית (למרות שאזו אינה שגיאה).
 

sparty

New member
תודה על ההארה בעניין ה collation

אני בסך הכל שלושה שבועות " בעניינים " , כך שייתכנו לי בעתיד עוד הארות והערות מקצועיות הרעיון הוא להעלות פתרון ובכיייייף ....למען אלו הבאים מחר עם אותה בעייה , ולא "יבזבזו" , יומיים עד שיעלו על הפתרון ושוב תודה
 
למעלה